不太:作爲@Pete貝克爾在評論中指出的,如果你曾經被稱爲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
版本以特定方式調用它。
從斯科特邁爾斯Effective C++ - Third Edition:
當const
和非const
成員函數具有基本上相同的實施方式中,代碼重複可以通過使非const
版本調用const
版本
避免斯科特·邁爾斯繼續提供一個安全的方法來做到這一點:
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
-ness的回報。這是安全的,因爲要撥打非const
版本,您必須擁有非const this
。
但是,如果你只是提供一個成員訪問,它的簡單和易於閱讀,只是有以下幾點:
class TestAccess;
class Test
{
TestAccess& t;
public:
const TestAccess& getA() const { return t; }
TestAcess& getA() { return t; }
};
來源
2016-01-25 01:21:50
Tas
此代碼調用doSomething'的'非const版本。嘗試調用const版本並觀看它爆炸。 –
爲什麼不在分配它時初始化'someInt':'int * someInt = new int(a);' – erip
我一直認爲C++不允許超載僅返回類型不同的函數.... – Anedar