2010-07-25 68 views
3
class A{ 
private: 
    int a; 
public: 
    A() {a = 4;} 
    const int& random1() const {return a; } 
    //int&  random2() const {return a; } 
    const int* random3() const {return &a;} 
    //int*  random4() const {return &a;} 
}; 

int main(){ 
    A objA; 
    cout<<objA.random1()<<"\n"; 
    cout<<*objA.random3()<<"\n"; 
} 

random2()random4()是不允许的,如上所述。我总是知道这一点,但直到今天,从未写过我自己的代码。什么都不允许使用const成员函数?

除了这两种情况之外,什么都不允许在const成员函数中使用?

任何对C++标准文本的引用也会有所帮助。谢谢!

回答

10

首先明白const T*是指向一些不能更改的T的指针。第二件要记住的是所有成员实际上都通过this->访问。

所以(§9.3.1):

阿非静态成员函数可以被声明为const,易失性或const挥发性。这些cvqualifiers影响这个指针的类型(9.3.2)。

而且它做什么(§9.3.2):

在非静态(9.3)成员函数的主体,关键字这是一个非左值表达式,其值为的地址该函数被调用的对象。 X类的成员函数中的类型是X *。如果成员函数声明为const,则其类型为const X *,如果成员函数声明为volatile,则其类型为volatile X *,并且如果成员函数声明为const volatile,则其类型为const挥发性X *。

上的功能的const使得this指针const T*

这就是为什么这些示例失败:在int&变型,a访问为this->athisconst T*,所以aconst intconst int不能隐式转换为int&。与其他功能相同。

换句话说,当一个函数为const时,它会在类中的所有内容上剔除const,并且不能隐式地将const转换为远端。

0

即使不更改任何成员数据,Const成员函数也不能调用非const成员函数。有时你需要提供同一个函数的const和非const版本,因为这个指针被隐式地传递给成员函数,并在重载解析中扮演一个角色。

相关问题