Не совсем: в @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; }
};
Этот код вызывает неконстантную версию 'doSomething'. Попробуйте вызвать версию const и посмотрите, как она взорвалась. –
Почему вы не просто инициализируете 'someInt' при его выделении:' int * someInt = new int (a); ' – erip
Я всегда думал, что C++ не позволяет перегружать функции, которые отличаются только по типу возврата .... – Anedar