2013-08-30 2 views
1

У меня есть класс с двумя функциями-членами, которые отличаются только модификатором const.Функция члена с модификатором const.

class CFoo 
{ 
private: 
    int x; 
    int y; 
public: 
    static int a; 
    void dosmth() const { 
     a = 99; 
    } 
    void dosmth(){ 
     x++; 
     y++; 
    } 
}; 

int CFoo::a = 100; 

int main(){ 
    CFoo foo; 
    cout << CFoo::a << endl; 
    foo.dosmth(); 
    cout << CFoo::a << endl; 
} 

Следующий код печатает 100, 100. Почему называется неконстантный dosmth? Как я могу назвать версию const явно?

ответ

4

Почему неконстантная dosmth называют?

Это по дизайну. Если у вас есть неконстантный объект, непостоянная перегрузка выбирается над const.

ow я могу вызвать версию const явно?

Вам нужен контекст, в котором ваш объект const. Например,

void dofoo(const Foo& f) { f.dosmth(); } 
int main() 
{ 
    CFoo foo; 
    dofoo(foo); 
    cout << CFoo::a << endl; 

или

int main() 
{ 
    const CFoo foo1{}; 
    foo1.dosmth(); 
    CFoo foo2; 
    const_cast<const CFoo&>(foo2).dosmth(); 
} 
+1

или const_cast (foo) .dosmth(); – Jarod42

+0

@ Jarod42 Спасибо, я добавил пример. – juanchopanza

+0

'const CFoo foo1;' не сможет скомпилироваться, потому что члены 'x' и' y' не имеют инициализаторов. –

3

Версия const вызывается только тогда, когда объект сам по себе является константой. Это означает, что вы можете назвать константные версии с этим кодом:

int main(){ 
    const CFoo foo; 
    cout << CFoo::a << endl; 
    foo.dosmth(); 
    cout << CFoo::a << endl; 
} 
+0

Пожалуйста, попробуйте код и посмотреть, если он компилирует. –

Смежные вопросы