C++ 常量成员函数与常量友元函数
此代码如何修改常量函数中的值:C++ 常量成员函数与常量友元函数,c++,C++,此代码如何修改常量函数中的值: #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
#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);
}
#包括
使用名称空间std;
Y类;
X类{
公众:
无效通道(Y&Y)常数;
};
Y类{
int d;
公众:
friend void X::access(Y&Y)const;
Y(){d=0;}
};
无效X::访问(Y&Y)常量
{
cout因为在常量
函数中,只有*这个
是常量
,而不是传递给函数或其他任何东西的参数。因为在常量
函数中,只有*这个
是常量
,而不是传递给函数或其他任何东西的参数。在第一个示例中,这个X::access(Y&Y)const
上的e const限定符表示调用它的X
对象不能修改。由于Y
参数是由非const引用获取的,因此可以从函数内修改它
在第二个示例中,Y::set()const
上的常量限定符意味着调用它的Y
对象无法修改,因此在第一个示例中,您无法修改不可变成员变量d
,即X::access(Y&Y)上的常量限定符const
表示调用它的X
对象不能修改。因为Y
参数是由非const引用获取的,所以可以从函数内部修改它
在第二个示例中,Y::set()const
上的const限定符意味着调用它的Y
对象无法修改,因此不能修改不可变的成员变量d
作为const的成员函数只承诺不更改它所属类的任何成员(如果声明为可变,则执行)
在第一个示例中,Y.d在方法X::access中被修改。该方法不修改X本身的任何成员,因此是完全正常的
但是,在第二个示例中,Y::set()方法被声明为const,因此它不能更改Y::d
下次,请在此处发布代码,而不是提供链接。常量成员函数仅承诺不更改其所属类的任何成员(如果声明为可变,则执行)
在第一个示例中,Y.d在方法X::access中被修改。该方法不修改X本身的任何成员,因此是完全正常的
但是,在第二个示例中,Y::set()方法被声明为const,因此它不能更改Y::d
下次,请在此处发布代码,而不是提供链接。因为在第一个示例中:
void X::access(Y &y) const;
const
告诉编译器,函数不会修改隐式此
参数指向的类X
对象。作为引用传递的类Y
对象不是const
在第二个示例中,set()
函数是类Y
的成员:
void set() const
它的声明使得指向Y对象的隐式this
参数是一个常量指针(因此对象不能被修改)
如果希望不允许X::access()
修改传递给它的Y
对象,请将声明更改为:
void X::access(Y const& y) const;
因为在你的第一个例子中:
void X::access(Y &y) const;
const
告诉编译器,函数不会修改隐式此
参数指向的类X
对象。作为引用传递的类Y
对象不是const
在第二个示例中,set()
函数是类Y
的成员:
void set() const
它的声明使得指向Y对象的隐式this
参数是一个常量指针(因此对象不能被修改)
如果希望不允许X::access()
修改传递给它的Y
对象,请将声明更改为:
void X::access(Y const& y) const;
将来,请在问题中发布你的代码,不要在外部网站上链接到它。将来,请在问题中发布你的代码,不要在外部网站上链接到它。我不同意这句话:一个成员函数是const,它只承诺不改变它所属类的任何成员(如果它们被声明为可变的,则执行)。函数中的常量限定符不允许修改调用该函数的对象。因此我猜您的答案是不明确的!!因为这样做有效:x1.access(x2);你说得对,这有点含糊不清。用“普通”语言描述标准并不总是那么容易。我不同意这样的说法:一个成员函数为const,只承诺不更改它所属类的任何成员(如果声明为可变的,则执行)。函数中的常量限定符不允许修改调用该函数的对象。因此,我猜您的答案是不明确的!!因为这是可行的:x1.access(x2);您是对的,它有点不明确。用“普通”语言描述标准并不总是那么容易。。