我对加速度方法有const,但我可以调用权力方法。他们是否真的阻止了这一点?常量正确性和成员指针
class Engine{
public:
void Power(){
}
};
class Car{
public:
Car() : p(new Engine()){}
void Accelerator() const{
p->Power();
}
private:
Engine* p;
};
我对加速度方法有const,但我可以调用权力方法。他们是否真的阻止了这一点?常量正确性和成员指针
class Engine{
public:
void Power(){
}
};
class Car{
public:
Car() : p(new Engine()){}
void Accelerator() const{
p->Power();
}
private:
Engine* p;
};
对于Car
,const方法是一种不修改Car
成员变量的方法。
所以,只要Car::Accelerator
不会使p
指向不同的位置,它是有效的。
因为p
没有修改在Accelerator
(意思是它不指向不同的内存地址),程序是有效的。
的时刻,你让p
点到不同的位置,该程序无法编译:
void Accelerator() const {
p= nullptr; //wrong
}
Const保护只影响直接成员,在这种情况下只是指针。此对象外的值(又名。指向值)不受保护。
您必须决定是否将自己或别人的指向值考虑在内。
您可以修改成员Engine
为const*
,这将使Engine
对象Car
const
指向p
:
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(){
^
但这意味着没有Car
的成员可以修改*p
,这可能不是你想要的。查看@ NathanOliver的评论以获得更好的答案。
希望这会有所帮助。
因为你'Engine'指针'const',而不是它指向的东西。 – AndyG
是否有一个原因,你需要一个'Engine *'而不是一个'Engine'? – NathanOliver
真正的汽车将包含引擎,而不仅仅指向一个。 –