不完全是:正如@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
版本以特定方式调用它。
来自 Scott Myers Effective C++ - 第三版:
当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
版本中,有两种转换: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; }
};