C++;复制构造函数&;操作员 我目前正在准备我的C++考试,今天我遇到了以下问题:
鉴于以下计划:C++;复制构造函数&;操作员 我目前正在准备我的C++考试,今天我遇到了以下问题:,c++,visual-studio,visual-c++,constructor,copy-constructor,C++,Visual Studio,Visual C++,Constructor,Copy Constructor,鉴于以下计划: #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
#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;
}
而不是
A operator+(A a)
但是学期结束了,我没有人要问,所以我来了。
我不知道在去年的考试中到底使用了哪个版本的VC++,
由于错误选项不包含在回答选项中,所以我理解(也许)这个代码在C++的早期版本中是有效的。但我的问题是:
这个错误来自C++版本之间的差异吗?p>
上述两种版本的运算符+方法之间的主要区别是什么
运算符+和运算符=方法是否必须具有相同的返回类型(我指的是引用或值)
运算符+和运算符=方法的参数必须与复制构造函数的参数相同吗
任何帮助都将不胜感激!谢谢在标准C++中,所有的答案都是错误的。实际行为是由于以下行导致代码无法编译:
c = a + b;
右侧具有值类别prvalue。operator=
函数将A&
作为参数,prvalue不能绑定到非常量左值引用
顺便说一下你的评论
运算符+方法应该是这样的:A&operator+(A&A)
这是错误的。运算符+
的实际定义是正确的。错误是复制构造函数和赋值运算符,它们应该取常量&
< P>可能是微软的非标准语言,其中PR值可以绑定到同一类型的LValk引用。标准C++中的< P>,所有建议的答案都是错误的。实际行为是由于以下行导致代码无法编译:
c = a + b;
右侧具有值类别prvalue。operator=
函数将A&
作为参数,prvalue不能绑定到非常量左值引用
顺便说一下你的评论
运算符+方法应该是这样的:A&operator+(A&A)
这是错误的。运算符+
的实际定义是正确的。错误是复制构造函数和赋值运算符,它们应该取常量&
可能该测试是指Microsoft的非标准语言方言,其中prvalue可以绑定到同一类型的左值引用。简短的回答是:通过编译器运行它,并在标准输出上查看输出。这太宽泛了。请每个问题问一个问题。作为旁注,您的老师/教授应该知道
使用名称空间std
是一种不好的做法,我们不再需要返回0代码>在主功能中。和系统(“暂停”)代码>也是可疑的。正如Visual Studio善意地告诉您的,您显示的代码无效。似乎你的教授没有正确地测试它,或者使用编译器测试了它,让错误通过。这段代码是不正确的。如果你修复了 const 问题,输出将取决于C++的版本和使用的标志。有一些复制省略的可能性,这是一种特殊情况下允许改变程序可观察行为的优化类型。operator+
肯定不应该是a&operator+(a&a)
。你会返回什么?如果返回a
或*此
,则表示您修改了一个操作数,而该运算符不应这样做。如果尝试返回局部变量,则将返回对不再存在的对象的引用。问题是通过一个自由的应用程序来解决的:<代码> const 。我期望<代码> A(const A/A)< /> >,如果你学习了现代C++,我还期望有一个<代码>(A&A)< /COD>移动构造函数。但无论如何,简单的答案是:通过编译器运行它,并在标准输出上查看输出。这太宽泛了。请每个问题问一个问题。作为旁注,您的老师/教授应该知道使用名称空间std
是一种不好的做法,我们不再需要返回0代码>在主功能中。和系统(“暂停”)代码>也是可疑的。正如Visual Studio善意地告诉您的,您显示的代码无效。似乎你的教授没有正确地测试它,或者使用编译器测试了它,让错误通过。这段代码是不正确的。如果你修复了 const 问题,输出将取决于C++的版本和使用的标志。有一些复制省略的可能性,这是一种特殊情况下允许改变程序可观察行为的优化类型。operator+
肯定不应该是a&operator+(a&a)
。你会返回什么?如果返回a
或*此
,则表示您修改了一个操作数,而该运算符不应这样做。如果尝试返回局部变量,则将返回对不再存在的对象的引用。问题是通过一个自由的应用程序来解决的:<代码> const 。我期望<代码> A(const A/A)< /> >,如果你学习了现代C++,我还期望有一个<代码>(A&A)< /COD>移动构造函数。但无论如何。事实上,这再次证明教授只是人,因此他们可能会犯错误;)事实上,这再次证明教授只是人,因此他们可能会犯错误;)