2016-07-28 84 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的评论以获得更好的答案。

希望这会有所帮助。