2016-07-28 96 views
2

我對加速度方法有const,但我可以調用權力方法。他們是否真的阻止了這一點?常量正確性和成員指針

class Engine{ 
public: 
    void Power(){ 
    } 
}; 

class Car{ 
public: 
    Car() : p(new Engine()){} 

    void Accelerator() const{ 
     p->Power(); 
    } 
    private: 
     Engine* p; 
}; 
+0

因爲你'Engine'指針'const',而不是它指向的東西。 – AndyG

+1

是否有一個原因,你需要一個'Engine *'而不是一個'Engine'? – NathanOliver

+0

真正的汽車將包含引擎,而不僅僅指向一個。 –

回答

2

對於Car,const方法是一種不修改Car成員變量的方法。

所以,只要Car::Accelerator不會使p指向不同的位置,它是有效的。

因爲p沒有修改在Accelerator(意思是它不指向不同的內存地址),程序是有效的。

的時刻,你讓p點到不同的位置,該程序無法編譯:

void Accelerator() const { 
     p= nullptr; //wrong 
    } 
2

Const保護隻影響直接成員,在這種情況下只是指針。此對象外的值(又名。指向值)不受保護。

您必須決定是否將自己或別人的指向值考慮在內。

2

您可以修改成員Engineconst*,這將使Engine對象Carconst指向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的評論以獲得更好的答案。

希望這會有所幫助。