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()非法.
一个对象的"常量性"并没有通过指针扩展到其它对象.在您的示例中,该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().
| 归档时间: |
|
| 查看次数: |
350 次 |
| 最近记录: |