は、私が最初のconstは、あなたが正しいです
のconstになり、char *を返していることを示していると思います。 what()
メンバ関数は、定数文字へのポインタであるタイプconst char *
の値を返します。これは他の関数から返された値とまったく同じです。ポインタとconst指定子を含む型宣言を読み込む方法がわからない場合は、study upにする必要があります。
私は考える...第2のconstは、呼び出されたオブジェクト(MyException)が変更されないようにすることです。
これも正しいです。 const
指定子がメンバ関数のシグネチャの終わりに来ると、そのメンバ関数がconst
のインスタンスで動作することを指定します。換言すれば、これが合法である:
const MyException myex;
std::cout << myex.what() << std::endl;
const
がwhat()
機能シグネチャから省略された場合、上記のコードが不正であったであろう一方。 myex
は非constでなければなりませんでした。
一般に、オブジェクトの状態を変更しないメンバ関数は、const
とマークして、const-correctコードの作成を促進する必要があります。
throw()にはわかりません。
これは、C++ 03スタイルの例外指定子です。空のthrow()
は、関数が例外をスローしないことを保証します。 ではなく、関数呼び出しです。カッコで囲まれているのは、引数として例外が発生する可能性があるからです。たとえば、throw(int)
は、関数がタイプint
の例外をスローする可能性があることを意味します(これは決して投げられるべきではありませんが、これは単なる例です)。
新しいC++ 11スタイルは、noexcept
という注釈です。これは、現代のC++コードを書くときに一般的に好むべきものです。他には がコメントされています。もはやカッコで囲まれた構文を使用しないことに注意してください。これは、関数がまったく投げないことを示す非常に特殊な場合を除いて、動的例外の仕様が役に立たないということが広く認められているからです。
グーグル「例外仕様C++」は関連性の高い情報を多く返します。
また、構造体とクラスを使用して独自の例外を作成するのに違いがありますか?
いいえ、問題ではありません。 struct
とclass
は、デフォルトのアクセス修飾子を除いてC++では同じです。つまり、デフォルトでstruct
のメンバーはすべてpublic
ですが、class
のメンバーはすべてデフォルトでprivate
です。
C++では、struct
というキーワードは実際にはclass
を定義しています。今、意味的に、私と他の人はstruct
PODタイプのために好きで、class
他のすべてのためにこれを使用するのが好きですが、これは言語によって強制されるものではありません。いずれか1つを置き換えることができます(MSVCの特定のバージョンでは、クラスの2つの異なる宣言が表示されたときに警告を出すもの、struct
を使用するものとclass
を使用するものは例外ですが、これはナンセンス警告です。それを安全に無視または抑制することができます)。
投げが例外仕様です。あなたはそれをGoogleにすることができます。 – SergeyA
参照:[動的例外の仕様](http://en.cppreference.com/w/cpp/language/except_spec) – sharyex
'throw()'を 'noexcept'に置き換えるべきです。あなたのチュートリアルは6年で時代遅れです。 –