从const方法对成员调用nonconst方法

bob*_*obo 6 c++ pointers const const-correctness

我惊讶地发现"const"中的这个"漏洞":

#include <stdio.h>

class A
{
  int r ;
public:
  A():r(0){}

  void nonconst()
  {
    puts( "I am in ur nonconst method" ) ;
    r++;
  }
} ;

class B
{
  A a ;
  A* aPtr ;

public:
  B(){ aPtr = new A() ; }

  void go() const
  {
    //a.nonconst() ;      // illegal
    aPtr->nonconst() ;  //legal
  }
} ;

int main()
{
  B b ;
  b.go() ;
}
Run Code Online (Sandbox Code Playgroud)

因此,基本上从const方法B::go(),如果指针引用了类型的对象,则可以调用非const成员函数(恰当地命名nonconst())A.

这是为什么?看起来像一个问题(它在我的代码中,我找到了它.)

Dav*_*e S 11

当类型的对象B是const时,它的所有成员都是const,这意味着它的两个成员在有效期内是B::go()有效的

A const a;
A * const aPtr;
Run Code Online (Sandbox Code Playgroud)

第一个是类型的常量对象A,在其上只能调用const成员函数.然而,第二个是指向非常数的常量指针A.你无法aPtr = <anything>在函数内合法地说B::go(),因为那会修改aPtr,这是不变的.

指向常量的指针A将被声明为A const* aPtror const A* aPtr,然后将调用非常量A::nonconst()非法.


Gre*_*ill 6

一个对象的"常量性"并没有通过指针扩展到其它对象.在您的示例中,该const部件是整个对象a指针 aPtr.因为aPtr是a A *而不是a const A *,所以允许调用非const方法.

如果你改变了

A* aPtr ;
Run Code Online (Sandbox Code Playgroud)

const A* aPtr ;
Run Code Online (Sandbox Code Playgroud)

然后你将无法打电话aPtr->nonconst().

  • 当一个对象是`const`时,它的所有成员都是`const`.你无法改变`aPtr`指向`const`方法的内容.但是,您当前的对象是`const`不会影响任何*other*对象的`const`-ness. (2认同)