在常量成员函数内调用非常量成员函数

时间:2012-12-28 13:49:06

标签: c++ constants member-functions

#include <iostream>

class Hello {
public:
    void Test() {
        std::cout << "Testing" << std::endl;
    }
};

class Hi {
public:
    Hi()
    :hello(new Hello())
    {}

    ~Hi()
    {
        delete hello;
    }

    void Testing() const {
        hello->Test();
    }

private:
    Hello  * hello;
};

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

我知道非常量成员函数不能在常量成员函数内调用,但上述代码如何成功编译并给出预期结果。

3 个答案:

答案 0 :(得分:2)

Hi::Testing内,hi对象是“const”。这意味着无法在该方法中修改指针hello。 (就好像hello在该方法的持续时间内被定义为Hello * const hello;。)

但这并不意味着hello被转换为指向const的指针(看起来像Hello const * const hello;)。 hello指向的对象不是const,因此您可以无限制地调用其非const方法。

答案 1 :(得分:2)

您可以将问题减少到以下情况:

Foo x;

Foo       *       p1 = &x;
Foo       * const p2 = &x;

p1->non_const_method();     // OK
p2->non_const_method();     // OK

Foo const *       q1 = &x;
Foo const * const q2 = &x;

q1->non_const_method();     // error
q2->non_const_method();     // error

您的Hi - 对象是否保持不变只会影响此类比中的顶级 const修饰符(即Hi::hello是否为{{1} }或Hello *)。但是,第一个 const修饰符是指针类型本身的一个组成部分(并且不受对象常量的影响)。

答案 2 :(得分:1)

如果你有一个指向const对象的指针,那将限制你在目标对象中调用const成员函数。

指向(普通)对象的const指针只意味着您无法修改指针本身。由于它仍然是指向普通对象的指针,因此您可以使用任何成员函数,而不仅仅是const成员函数。如果目标对象具有该函数的常量和正常重载,则将选择正常的重载。

当你有一个指针作为const对象的成员时,你得到第二个,而不是第一个。