为什么const成员函数能够通过成员指针调用非const成员函数?

时间:2012-06-01 07:49:18

标签: c++

  

可能重复:
  Invoking a nonconst method on a member from a const method

常量成员函数能够通过C ++中的指针成员变量调用非常量成员函数,是否符合预期? 下面给出了代码片段正在成功编译

#include <iostream>

class S {
public:
    void hi() {
        std::cout << "Hi" << std::endl;
    }
};

class T {
public:
    T()
    : s(new S())
    {}

    ~T()
    {
        delete s;
    }

    void hi() const {
        s->hi();
    }

private:
    S  * s;
};

int main(int argc, char ** argv) {
    T t;
    t.hi();
    return 0;
}

2 个答案:

答案 0 :(得分:4)

行为是正确的。

那是因为指针是const - S * s;,而不是对象。

例如,以下内容将失败:

void hi() const {
    s->hi();     //OK
    s = NULL;    //not OK
}

请记住,您不能修改s(这是一个指针),但您可以修改*s,这是实际的对象。

答案 1 :(得分:2)

const成员函数中s的类型是S * const,而不是S const*,这意味着指针本身是常量,而不是指针指向的对象。因此,非const的对象用于调用非const函数,这是符合标准的行为。

S const * s1 = initialization1; //same as : const S *s1  = initialization1;
S * const s2 = initialization2;

s1->hi();     //error: the object is const
s1 = nullptr; //okay : the pointer is non-const

s2->hi();     //okay: the object is non-const
s2 = nullptr; //error: the pointer is const