我很惊讶地发现这种“常量”性的“漏洞”:
#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* aPtr
或 const A* aPtr
,这将使调用非常量 A::nonconst()
变得非法。关于c++ - 通过const方法在成员上调用nonconst方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8556794/