我在Accelerate方法上有const,但我可以调用power方法。他们是一种真正阻止这种情况的方法。
class Engine{
public:
void Power(){
}
};
class Car{
public:
Car() : p(new Engine()){}
void Accelerator() const{
p->Power();
}
private:
Engine* p;
};
答案 0 :(得分:2)
Const保护仅影响直接成员,在这种情况下仅指向指针。此对象之外的值(也称为尖头值)不受保护。
您必须决定是否将指出的值视为您自己或其他人。
答案 1 :(得分:2)
您可以将成员B
修改为B
,这将使Engine
const*
中的Engine
指向p
对象:
Car
这将不再编译:
const
但这意味着class Engine{
public:
void Power(){
}
};
class Car{
public:
Car() : p(new Engine()){}
void Accelerator() const{
p->Power();
}
private:
Engine const* p;
};
的成员不能修改test_const.cpp:12:9: error: member function 'Power' not viable: 'this' argument
has type 'const Engine', but function is not marked const
p->Power();
^
test_const.cpp:3:10: note: 'Power' declared here
void Power(){
^
,这可能不是你想要的。有关更好的答案,请参阅@ NathanOliver的评论。
希望这有帮助。
答案 2 :(得分:2)
对于Car
,const方法是一种不修改Car
成员变量的方法。
因此,只要Car::Accelerator
未将p
指向其他位置,就会有效。
由于p
中Accelerator
未被修改(意味着它不指向不同的内存地址),因此该程序有效。
当你p
指向不同的位置时,程序无法编译:
void Accelerator() const {
p= nullptr; //wrong
}