可能重复:
Invoking a nonconst method on a member from a const method
常量成员函数能够通过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;
}
答案 0 :(得分:4)
行为是正确的。
那是因为指针是const
- S * s;
,而不是对象。
例如,以下内容将失败:
void hi() const {
s->hi(); //OK
s = NULL; //not OK
}
请记住,您不能修改s
(这是一个指针),但您可以修改*s
,这是实际的对象。
答案 1 :(得分:2)
const成员函数中s
的类型是S * const
,而不是S const*
,这意味着指针本身是常量,而不是指针指向的对象。因此,非const的对象用于调用非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