#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函数吗?
答案 0 :(得分:2)
关键是const
成员函数中的const
是谁?尖兵?
在const
成员函数f
中,ptr_
,即,指针本身被视为const
,而不是它所指向的对象。您在指针对象上调用非常量成员函数g
,就可以了。
此外,您无法像ptr_
那样对指针obj_
本身(与ptr_ = std::make_shared<B>();
相同)进行任何修改(并调用非const成员函数);但是您可以对它指向的对象执行此操作,例如*ptr_ = B{};
。