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);您是对的,它有点不明确。用“普通”语言描述标准并不总是那么容易。。