1
#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;
}

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

4

3 回答 3

2

在内部Hi::Testinghi对象“是 const”。hello这意味着不能在该方法内修改指针。(就好像hello已经定义Hello * const hello;了该方法的持续时间。)

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

于 2012-12-28T13:52:14.313 回答
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-object 是否为常量仅影响此类比中的顶级 const修饰符(即Hi::helloisHello *Hello * const)。但是,第一个const 修饰符是指针类型本身的组成部分(不受对象的 const 影响)。

于 2012-12-28T14:00:37.110 回答
1

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

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

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

于 2012-12-28T14:07:01.803 回答