我很惊讶地发现这种“常量”性的“漏洞”:

#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() ;
}

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

这是为什么?似乎是一个问题(在我的代码中找到了它。)

最佳答案

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

A const a;
A * const aPtr;

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

指向常量 A 的指针将被声明为 A const* aPtrconst A* aPtr ,这将使调用非常量 A::nonconst() 变得非法。

关于c++ - 通过const方法在成员上调用nonconst方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8556794/

10-11 23:12
查看更多