我目前正在为C++考试做准备,今天我遇到了以下问题:
鉴于以下方案:
#include <iostream>
using namespace std;
class A
{
private:
int x, y;
public:
A(int X = 0, int Y = 0) :x(X), y(Y)
{
cout << "A Constructor" << endl;
}
A(A& a)
{
x = a.x; y = a.y;
cout << "A Copy Constructor" << endl;
}
A operator+(A a)
{
A tmp(*this);
tmp.x += a.x;
tmp.y += a.y;
return tmp;
}
A& operator=(A& a)
{
x = a.x;
y = a.y;
return *this;
}
};
int main()
{
A a(1, 2), b(3, 4), c;
c = a + b;
system("pause");
return 0;
} 下列哪一项是程序的输出?
1)
建设者
建设者
建设者
副本构造器
副本构造器
副本构造器
2)
建设者
建设者
建设者
副本构造器
副本构造器
副本构造器
副本构造器
3)
建设者
建设者
建设者
副本构造器
4)
建设者
建设者
副本构造器
副本构造器
副本构造器
这是去年考试中的一个问题,问题是,当我在Visual C++ 2017中运行上述代码时,它会产生一个错误,如图中所示:

它说:no操作符"=“匹配这些操作数,操作数类型是:a= A。
我意识到代码中有什么问题,并发现operator+方法应该如下所示:
A& operator+(A& a)而不是
A operator+(A a) 但是这个学期已经结束了,我没有人要问,所以我来到这里。我不知道在过去一年的考试中使用了哪个版本的VC++,而且由于答案选项中没有包含错误选项,我理解(也许)这段代码在早期版本的C++中是有效的。但我的问题是:
此错误是否来自C++版本之间的差异?
以上两个版本的operator+方法的主要区别是什么?
operator+和operator=方法必须具有相同的返回类型(我指的是引用还是值)?
operator+和operator=方法的参数必须与复制构造函数的参数相同吗?
任何帮助都将不胜感激!谢谢!!
发布于 2018-07-11 13:24:53
在标准C++中,所有建议的答案都是错误的。实际行为是,由于行的原因,代码无法编译:
c = a + b; 右边有值类别prvalue。operator=函数以A&作为参数,而prvalue不能绑定到非const值引用。
顺便提一下你的意见
operator+方法应该如下所示:
A& operator+(A& a)
是错的。operator+的实际定义是正确的。错误是复制构造函数和赋值操作符,它们应该采用A const&.
考试可能是指微软的非标准语言方言,其中一个prvalue可以绑定到相同类型的lvalue引用。
https://stackoverflow.com/questions/51286500
复制相似问题