2016-11-29 14 views
-2

tutorialspointには、独自の例外を作成する方法の一番下の例があります。指定されたコードは:サンプルコードの不明な例外形式(C++)

struct MyException : public exception { 
    const char * what() const throw() { 
     return "C++ Exception"; 
    } 
}; 

私は2つの呼び出しで、これがどのようにフォーマットされているのか分かりません。最初のconstは、constになるchar *を返すことを示し、2番目のconstは、呼び出されたオブジェクト(MyException)が確実に変更されないようにすることです。呼び出しの最後にthrow()には不明です。

また、構造体とクラスを使用して独自の例外を作成することには違いがありますか?

+0

投げが例外仕様です。あなたはそれをGoogleにすることができます。 – SergeyA

+0

参照:[動的例外の仕様](http://en.cppreference.com/w/cpp/language/except_spec) – sharyex

+2

'throw()'を 'noexcept'に置き換えるべきです。あなたのチュートリアルは6年で時代遅れです。 –

答えて

0

throw()は廃止された「動的例外仕様」です。この関数自体は例外をスローしません。現代のそれと同等のものはnoexceptです。

structの代わりにclassを使用した場合は、機能の前にpublic:を挿入する必要があります。

1

は、私が最初のconstは、あなたが正しいです

のconstになり、char *を返していることを示していると思います。 what()メンバ関数は、定数文字へのポインタであるタイプconst char *の値を返します。これは他の関数から返された値とまったく同じです。ポインタとconst指定子を含む型宣言を読み込む方法がわからない場合は、study upにする必要があります。

私は考える...第2のconstは、呼び出されたオブジェクト(MyException)が変更されないようにすることです。

これも正しいです。 const指定子がメンバ関数のシグネチャの終わりに来ると、そのメンバ関数がconstのインスタンスで動作することを指定します。換言すれば、これが合法である:

const MyException myex; 
std::cout << myex.what() << std::endl; 

constwhat()機能シグネチャから省略された場合、上記のコードが不正であったであろう一方。 myexは非constでなければなりませんでした。

一般に、オブジェクトの状態を変更しないメンバ関数は、constとマークして、const-correctコードの作成を促進する必要があります。

throw()にはわかりません。

これは、C++ 03スタイルの例外指定子です。空のthrow()は、関数が例外をスローしないことを保証します。 ではなく、関数呼び出しです。カッコで囲まれているのは、引数として例外が発生する可能性があるからです。たとえば、throw(int)は、関数がタイプintの例外をスローする可能性があることを意味します(これは決して投げられるべきではありませんが、これは単なる例です)。

新しいC++ 11スタイルは、noexceptという注釈です。これは、現代のC++コードを書くときに一般的に好むべきものです。他には がコメントされています。もはやカッコで囲まれた構文を使用しないことに注意してください。これは、関数がまったく投げないことを示す非常に特殊な場合を除いて、動的例外の仕様が役に立たないということが広く認められているからです。

グーグル「例外仕様C++」は関連性の高い情報を多く返します。

また、構造体とクラスを使用して独自の例外を作成するのに違いがありますか?

いいえ、問題ではありません。 structclassは、デフォルトのアクセス修飾子を除いてC++では同じです。つまり、デフォルトでstructのメンバーはすべてpublicですが、classのメンバーはすべてデフォルトでprivateです。

C++では、structというキーワードは実際にはclassを定義しています。今、意味的に、私と他の人はstruct PODタイプのために好きで、class他のすべてのためにこれを使用するのが好きですが、これは言語によって強制されるものではありません。いずれか1つを置き換えることができます(MSVCの特定のバージョンでは、クラスの2つの異なる宣言が表示されたときに警告を出すもの、structを使用するものとclassを使用するものは例外ですが、これはナンセンス警告です。それを安全に無視または抑制することができます)。

関連する問題