そうではありません: @Pete Becker がコメントで指摘したように、再帰するバージョンを呼び出したconst
場合:
class test {
public:
int* doSomething(int a) {
int* someInt = new int;
*someInt = a;
return someInt;
}
const int* doSomething(int a) const {
return doSomething(a);
}
};
int main() {
const test a;
// You're not in for a good time:
a.doSomething(12345);
return 1;
}
重複したコードを必要とする関数のconst
非バージョンを提供する場合は、そのバージョンを実装してから、非バージョンに特定の方法でそれを呼び出させるのが最善です。const
const
const
スコット マイヤーズ効果的な C++ - 第 3 版から:
const
と非メンバー関数の実装が本質的に同一の場合、非バージョンにバージョンを呼び出すconst
ことでコードの重複を回避できます。const
const
Scott Myers は、これを行うための安全な手段を提供し続けています。
const int* doSomething(int a) const
{
int* someInt = new int;
*someInt = a;
return someInt;
}
int* doSomething(int a)
{
return const_cast<int*>(static_cast<const Test&>(*this).doSomething());
}
非const
バージョンでは、2 つのキャストstatic_cast
があります。非バージョンを呼び出すには、非バージョンが必要なので、これは安全です。this
const this
const_cast
const
const
const this
ただし、メンバーへのアクセスを提供するだけの場合は、次のようにするだけで簡単に読みやすくなります。
class TestAccess;
class Test
{
TestAccess& t;
public:
const TestAccess& getA() const { return t; }
TestAcess& getA() { return t; }
};