#include <iostream>
class Hello {
public:
void Test() {
std::cout << "Testing" << std::endl;
}
};
class Hi {
public:
Hi()
:hello(new Hello())
{}
~Hi()
{
delete hello;
}
void Testing() const {
hello->Test();
}
private:
Hello * hello;
};
int main(int argc, char ** argv) {
Hi hi; ;
hi.Testing();
return 0;
}
我知道非常量成员函数不能在常量成员函数内调用,但上述代码如何成功编译并给出预期结果。
答案 0 :(得分:2)
在Hi::Testing
内,hi
对象是“const”。这意味着无法在该方法中修改指针hello
。 (就好像hello
在该方法的持续时间内被定义为Hello * const hello;
。)
但这并不意味着hello
被转换为指向const的指针(看起来像Hello const * const hello;
)。 hello
指向的对象不是const,因此您可以无限制地调用其非const方法。
答案 1 :(得分:2)
您可以将问题减少到以下情况:
Foo x;
Foo * p1 = &x;
Foo * const p2 = &x;
p1->non_const_method(); // OK
p2->non_const_method(); // OK
Foo const * q1 = &x;
Foo const * const q2 = &x;
q1->non_const_method(); // error
q2->non_const_method(); // error
您的Hi
- 对象是否保持不变只会影响此类比中的顶级 const
修饰符(即Hi::hello
是否为{{1} }或Hello *
)。但是,第一个 const修饰符是指针类型本身的一个组成部分(并且不受对象常量的影响)。
答案 2 :(得分:1)
如果你有一个指向const对象的指针,那将限制你在目标对象中调用const成员函数。
指向(普通)对象的const指针只意味着您无法修改指针本身。由于它仍然是指向普通对象的指针,因此您可以使用任何成员函数,而不仅仅是const成员函数。如果目标对象具有该函数的常量和正常重载,则将选择正常的重载。
当你有一个指针作为const对象的成员时,你得到第二个,而不是第一个。