2012-06-01 2 views
2

Можно создать дубликат:
Invoking a nonconst method on a member from a const methodПочему функция-член-член может вызывать функцию не-const-члена через указатель-член?

Постоянные функции-члены имеют возможность вызывать не постоянное функции члена через переменные членов указатель в C++, это, как ожидалось? Ниже дают фрагмент кода успешно

#include <iostream> 

class S { 
public: 
    void hi() { 
     std::cout << "Hi" << std::endl; 
    } 
}; 

class T { 
public: 
    T() 
    : s(new S()) 
    {} 

    ~T() 
    { 
     delete s; 
    } 

    void hi() const { 
     s->hi(); 
    } 

private: 
    S * s; 
}; 

int main(int argc, char ** argv) { 
    T t; 
    t.hi(); 
    return 0; 
} 

ответ

4

компиляции поведение является правильным.

Это потому, что указатель const - S * s;, а не объект.

Например, следующее потерпит неудачу:

void hi() const { 
    s->hi();  //OK 
    s = NULL; //not OK 
} 

Помните, что вы не можете изменить s (который является указателем), но вы можете изменить *s, который является фактическим объектом.

+0

Мы не объявили S * const s внутри класса. То как он может быть постоянным указателем? – Kenta

2

Тип функции s в функции const-члена равен S * const, а не S const*, что означает, что указатель сам по себе является константой, а не объектом, на который указывает указатель. Таким образом, объект, который не является константой, используется для вызова функции non-const, которая является стандартным поведением.

S const * s1 = initialization1; //same as : const S *s1 = initialization1; 
S * const s2 = initialization2; 

s1->hi();  //error: the object is const 
s1 = nullptr; //okay : the pointer is non-const 

s2->hi();  //okay: the object is non-const 
s2 = nullptr; //error: the pointer is const 
Смежные вопросы