Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/159.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++;复制构造函数&;操作员 我目前正在准备我的C++考试,今天我遇到了以下问题:_C++_Visual Studio_Visual C++_Constructor_Copy Constructor - Fatal编程技术网

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 = 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>移动构造函数。但无论如何。事实上,这再次证明教授只是人,因此他们可能会犯错误;)事实上,这再次证明教授只是人,因此他们可能会犯错误;)