2011-04-27 208 views
4

我,为什么这个代码可以编译和运行有点糊涂:const成员函数澄清需要

class A 
{ 
private: 
    int* b; 
public: 
    A() : b((int*)0xffffffff) {} 
    int* get_b() const {return this->b;} 
}; 

int main() 
{ 
    A a; 
    int *b = a.get_b(); 
    cout<<std::hex<<b<<endl; 
    return 0; 
} 

运行此代码的输出是FFFFFFFF以及...意想不到的我。由于它在一个const成员函数中,因此this->b不应该返回const int*?因此return线应该产生一个编译器铸造错误尝试投放const int*int*

显然,在我什么const成员函数意味着知识这里有一个差距。 如果有人能帮我弥补这个空白,我会很感激。

回答

4

不,成员是int* const(从const函数中可以看出),这是完全不同的。

指针是const,而不是指向的对象。

+0

对。这解释了它。所以如果b是int并且get_b会尝试返回this-> b,那么我会得到cast转换错误。对? – eladidan 2011-04-27 15:11:59

+0

如果b是一个int并且你试图返回&b,编译器会抱怨,是的。 – 2011-04-27 15:14:50

+0

对不起,对,&(this-> b),谢谢 – eladidan 2011-04-27 15:17:43

2

const成员函数的一部分只是说,当this指针(也就是它被调用的对象)是const时,允许调用该函数。它与返回值无关。

class A{ 
public: 
    void non_const_func(){} 
    void const_func() const {} 
}; 

int main(){ 
    A a; 
    a.const_func(); // works 
    a.non_const_func(); // works too 

    const A c_a; 
    c_a.const_func(); // works again 
    c_a.non_const_func(); // EEEK! Error, object is const but function isn't! 

}

2

功能按值返回一个整数的指针 - 你不能改变类的成员是通过这个值的副本,所以没有违反常量。

0

在函数声明之后加上const就像你告诉编译器“嘿,我保证不修改*this!”。你的方法只是一个访问器。

请参阅C++ FAQ LITE 18.10