我對加速度方法有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
真正的汽車將包含引擎,而不僅僅指向一個。 –