在const方法中调用非const方法

时间:2019-09-05 09:30:26

标签: c++

#include <iostream>
#include <memory>

class B
{
  public:
  B(){}

  void g() { }
};

class A
{
 public:
 A()
 {
    ptr_ = std::make_shared<B>();  
 }

 void f() const 
 {
    ptr_->g(); // compile
    //obj_.g(); // doesn't compile as expected
 }

 std::shared_ptr<B> ptr_;
 B obj_;
};

int main()
{
  A a;
  a.f();
}

我很惊讶这段代码构建良好。在A :: f()中,我调用数据成员的非const方法。当此数据成员是指针时,它将构建,如果不是指针,则它不会按预期构建,因为B :: g()是非常量的。

您了解为什么我能够在const函数内部调用非const函数吗?

1 个答案:

答案 0 :(得分:2)

关键是const成员函数中的const是谁?尖兵?

const成员函数f中,ptr_,即,指针本身被视为const,而不是它所指向的对象。您在指针对象上调用非常量成员函数g,就可以了。

此外,您无法像ptr_那样对指针obj_本身(与ptr_ = std::make_shared<B>();相同)进行任何修改(并调用非const成员函数);但是您可以对它指向的对象执行此操作,例如*ptr_ = B{};