7

私は Ruby と Java のバックグラウンドを持ち、最近 C++ の探索を始めました。

例外クラスを単純にサブクラス化してカスタム例外を作成する最初の試みはあいまいに失敗しましたが、次の例がサイトに投稿されているのを見つけました。

class Exception : public exception
{
public:
  Exception(string m="exception!") : msg(m) {}
  ~Exception() throw() {}
  const char* what() const throw() { return msg.c_str(); }

private:
  string msg;
};

C++ のセマンティクスに対する私の理解は、現時点ではあまり成熟していません。ここで何が起こっているのかをよりよく理解したいと思っています。

ステートメントconst char* what() const throw()では、その部分は何をしますか? またconst throw()、それはどのような種類のプログラミング構造ですか?

throw()また、デストラクタ仕様の目的と意図は~Exception()何ですか?特に何かをする必要はないのに、なぜデストラクタ仕様が必要なのですか? destructor継承された例外で十分ではないでしょうか?

4

3 に答える 3

13

constメソッドがオブジェクトを変更しないことを宣言した後。(例外はありますが、一般的には「オブジェクトを外部から見えるように変更しない」という意味で使用されます。)

throw()メソッド宣言の後は例外指定です。throws E1, E2これは、Java で見られる例外仕様に似ています。ただし、C++ では、例外仕様はコンパイル時にチェックされず、一般的にほとんど役に立たないと考えられています (現在は非推奨になっています)。throw()これは、関数が例外をスローしてはならないことを宣言することを意味します (例外をスローしてはならない場合、それは論理エラーであり、プログラムは予期しない例外ハンドラーを呼び出し、デフォルトでプログラムを終了します)。

デストラクタが明示的に宣言されているのは、指定されていない場合、コンパイラは基本クラスのデストラクタを呼び出すデストラクタを生成し、コンパイラが生成したデストラクタはthrow()例外仕様を使用しないためです (デストラクタで例外をスローすることは決して良い考えではありません)。 .

于 2012-11-06T20:37:39.023 に答える
3

あなたは現在、C++ のいくつかのスタイルを扱っています! したがって、実際にexception-object が必要な場合は、 cppreference で説明されている を使用できstd::exceptionます。

しかし、C++ ではすべてをスローしてキャッチできるため、独自の例外クラスを定義したり、より基本的な側面を使用したりすることもできます。

try  {
    throw("S0M3, M4YB3 CR1PT1C STR1NG!");  
} catch(char const* exceptStr) {  
    SomeFuncThatDecodesTheString(exceptStr); 
}

あなたの他のトピックは、一種の個人的なスタイルまたは標準です。

  • のような空のデストラクタ~FooClass() {}は、「私は本当に何もしません!」という 2 つのショーしかありません。クラスを記述するために厳密なシステムを使用する場合(たとえば、最初に標準のctorを含み、2番目の関数として標準のdtorを含む最初のパブリックスペース...)、ある種の強制的に(またはいくつかの他のコーダー)既存のブレース/関数に書き込むため、聖なる秩序を破壊しません:)
  • throw()クラスが括弧内に記載されているタイプの例外のみをスローするように、他の人への保険の背後にあるクラスを作成することができます。したがって、関数はintscharsのみをスローするvoid FooFunc() throw(int,char) 必要があります。そして、空は実際に「やあコーダー、私は何も投げません!」と言うだけです。(ほとんどの場合) ソースではなくプロトタイプしか見ることができないため、C++ 標準ライブラリでこれを見つけることがよくあります。ところで、それは嘘かもしれません。関数、他の型をスローするか、何もスローしない可能性があります。しかし、これを使用するときは、嘘つきにならないでください ;)throw()throw(someType(s))

編集:

追加したかったのは、noexcept( C++11以降) 例外をスローするのではなく、関数の宣言にも使用できることです。よりもこちらの方が分かりやすいですthrow()

LG 入口

于 2012-11-06T20:30:37.013 に答える
2

throw()デストラクタ仕様の は、デストラクタが例外をスローしないことを意味します。C++ のデストラクタは例外をスローすべきではありません。その理由は次のとおりです。

C++ のデストラクタは継承されません。独自のデストラクタを作成しない場合、コンパイラは自動的にデストラクタを生成します。そのデストラクタは、そのようなクラスが存在する場合、基本クラスのデストラクタを呼び出します。

constException::what()宣言の指定子は、このメソッドが type の定数オブジェクトに対して呼び出される可能性があることを意味しますExceptionthrow()指定子はデストラクタと同じ意味です。

C++ についての本を手に入れる必要があります。これらは非常に基本的な質問です。

于 2012-11-06T20:48:59.433 に答える