問題は、からオブジェクトの非const
関数test2.test()
を呼び出すことです。const
test2
testing::test1
testing::test1
test2
パラメータとして取得しますconst testing &test2
。だからtesting::test1
、内test2const
。次に、関数の最初の行で:
test2.test()
testing::test
関数は で呼び出されますtest2
。その関数はconst
署名の最後で宣言されていないため、呼び出されたオブジェクト (this
暗黙的に渡されたポインター) を変更する可能性があります。そこで呼び出せるようにすることで、コンパイラはconst
明示的なキャストなしで変数を変更できるようになりますが、これは C++ では許可されていません。 したがって、エラーメッセージを説明するには:
test.cpp:15: error: passing ‘const testing’ as ‘this’ argument of ‘int testing::test()’ discards qualifiers
this
は、メンバー関数 ( testing::test
) が動作するオブジェクトを参照します。この場合、 は で宣言されていないconst
ため、オブジェクト ( ) を参照する非ポインター ( )を作成しようとすると不一致が検出され、無視されます。修飾子. _testing::test
const
const
this
const
testing
const
これを解決するには、関数が呼び出されたオブジェクトを変更する必要があるかどうかを判断しtesting::test
ます (現在の記述方法では変更されませんが、return 1
変更される可能性があるため、意図されていることを考える必要があります)。機能は)です。必要な場合、オブジェクトでそれを呼び出すのは明らかにconst
悪いですが、コンパイラにそれをオーバーライドするように依頼することはできますconst_cast
が、これは危険です。そうでない場合は、オブジェクトでも呼び出せるconst
ようにマークします。const
class testing{
int test1() const;
// ...
}
int testing::test() const {
// ...
}