此代码如何修改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;
}
答案 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
函数中,只有*this
是const
,而不是传递给函数或其他任何内容的参数。
答案 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。
下次,请在此处发布代码,而不是提供链接。