gpt4 book ai didi

c++ - 阐明 C++ 中 << 运算符重载的行为

转载 作者:行者123 更新时间:2023-11-30 01:05:10 26 4
gpt4 key购买 nike

程序如下:

#include <iostream>
using namespace std;
class X {
int no;
public:
X(int n=1) : no{n} {}
X(const X& rop) : no{rop.no * 11} {}
void f(X x, X& y);
ostream& print(ostream& o) const {return o << no;}
};
ostream& operator<<(ostream& o, const X& x) {
return x.print(o);
}
void X::f(X x, X& y) {
++no; ++x.no; ++y.no;
cout << *this << x << y;
}
int main()
{
X a, b{5}, c{6};
a.f(b, c);
cout << a << b << c;
return 0;
}

我期望输出:267257

但我得到的是:2567257

似乎,这种(对我而言)行为与 cout << x 有关, 但我不明白为什么 cout << x输出 56而不仅仅是 6

最佳答案

参数x被声明为按值传递;它将从参数 b 中复制。根据X的复制构造函数,数据成员no被初始化为rop.no * 11那么它就是55 。在 ++x.no; 之后,您将得到 56。传值也解释了为什么调用a.fb.no仍然是5,因为x是拷贝及其上的任何修改与参数 b 无关。

另一方面,y 被声明为按引用传递,因此没有复制,也没有调用复制构造函数。然后对于 y.no 你会得到 6 的值,在 ++y.no 之后它会是 7。在调用 a.f 之后,c.no 也变成了 7

关于c++ - 阐明 C++ 中 << 运算符重载的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48999165/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com