const正确性和成员指针

时间:2016-07-28 13:19:35

标签: c++ const const-correctness

我在Accelerate方法上有const,但我可以调用power方法。他们是一种真正阻止这种情况的方法。

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

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

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

3 个答案:

答案 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指向其他位置,就会有效。

由于pAccelerator未被修改(意味着它不指向不同的内存地址),因此该程序有效。

当你p指向不同的位置时,程序无法编译:

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