首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++复制构造函数及操作符

C++复制构造函数及操作符
EN

Stack Overflow用户
提问于 2018-07-11 13:18:16
回答 1查看 150关注 0票数 0

我目前正在为C++考试做准备,今天我遇到了以下问题:

鉴于以下方案:

代码语言:javascript
复制
#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+方法应该如下所示:

代码语言:javascript
复制
A& operator+(A& a)

而不是

代码语言:javascript
复制
A operator+(A a)  

但是这个学期已经结束了,我没有人要问,所以我来到这里。我不知道在过去一年的考试中使用了哪个版本的VC++,而且由于答案选项中没有包含错误选项,我理解(也许)这段代码在早期版本的C++中是有效的。但我的问题是:

此错误是否来自C++版本之间的差异?

以上两个版本的operator+方法的主要区别是什么?

operator+operator=方法必须具有相同的返回类型(我指的是引用还是值)?

operator+operator=方法的参数必须与复制构造函数的参数相同吗?

任何帮助都将不胜感激!谢谢!!

EN

回答 1

Stack Overflow用户

发布于 2018-07-11 13:24:53

在标准C++中,所有建议的答案都是错误的。实际行为是,由于行的原因,代码无法编译:

代码语言:javascript
复制
c = a + b; 

右边有值类别prvalue。operator=函数以A&作为参数,而prvalue不能绑定到非const值引用。

顺便提一下你的意见

operator+方法应该如下所示:A& operator+(A& a)

是错的。operator+的实际定义是正确的。错误是复制构造函数和赋值操作符,它们应该采用A const&.

考试可能是指微软的非标准语言方言,其中一个prvalue可以绑定到相同类型的lvalue引用。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51286500

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档