Const成员函数Vs Const Friend函数

时间:2010-06-17 14:09:54

标签: c++

此代码如何修改const函数中的值:

#include<iostream>
using namespace std;
class Y;
class X{
  public:
    void access(Y &y) const;
};

class Y{
    int d;
  public:
    friend void X::access(Y &y) const;
    Y(){d=0;}
}; 

void X::access(Y &y) const 
{
    cout<<"Y is "<<y.d<<endl;
    y.d=1;
    cout<<"Y is "<<y.d<<endl;
}

int main() {
    X x;
    Y y;
    x.access(y);
}

此代码出错:

#include<iostream>

using namespace std;

class Y{
    int d;
  public:
    void set() const{d=0;}
};                          

int main() {
    Y y1;
    return 0;
}

4 个答案:

答案 0 :(得分:4)

因为在你的第一个例子中:

void X::access(Y &y) const;

const告诉编译器该函数不会修改隐式class X参数指向的this对象。作为参考传递的class Y对象不是const

在第二个示例中,set()函数是class Y的成员:

 void set() const

并声明它指向Y对象的隐式this参数是一个const指针(因此无法修改对象)。

如果您不希望X::access()修改传递给它的Y对象,请将声明更改为:

void X::access(Y const& y) const;

答案 1 :(得分:3)

因为在const函数中,只有*thisconst,而不是传递给函数或其他任何内容的参数。

答案 2 :(得分:2)

在第一个示例中,X::access(Y &y) const上的const限定符意味着无法修改调用它的X对象。由于Y参数由非const引用获取,因此可以在函数内修改它。

在第二个示例中,Y::set() const上的const限定符意味着无法修改调用它的Y对象,因此无法修改非可变成员变量{{1 }}

答案 3 :(得分:2)

成员函数只是const,它承诺不会更改它所属类的任何成员(如果声明它们是可变的,则为execpt)。

在第一个示例中,Y.d正在方法X :: access中进行修改。该方法不会修改X本身的任何成员,因此完全正确。

但是在第二个例子中,Y :: set()方法被声明为const,所以它不能改变Y :: d。

下次,请在此处发布代码,而不是提供链接。