为了账号安全,请及时绑定邮箱和手机立即绑定

关于拷贝构造函数(复制构造函数)的问题

关于拷贝构造函数(复制构造函数)的问题

C++
Rimas 2018-11-30 12:16:44
不知道为什么,我自己写的拷贝构造函数,会导致后面的“classA c = a + b;” 以及“return classA(_number += a._number);”报错。以下为一个很简单的例子,您可以直接跑一下看看。#include <iostream>using namespace std;class classA{public: int _number; classA(){} classA(int number) {  _number = number; } ~classA(){} /*  问题出在我自己写的拷贝构造函数,它会导致后面的“classA c = a + b;” 以及“return classA(_number += a._number);”报错 classA(classA &a) {  _number = a._number; } */ classA operator+(classA &a) {  return classA(_number += a._number); }};int main(){ classA a(1),b(2); classA c = a + b; cout << c._number << endl; return 0;}
查看完整描述

1 回答

?
onemoo

TA贡献883条经验 获得超454个赞

你知道加上 const 就没事了,但你的解释用词不太准确,我不知道你的想法是否正确。我就直接详细说下吧:

导致这个问题的原因在 a + b 这个表达式上。

operator+ 这个函数返回的是普通的 classA 类型(这样做是对的),但这样的函数返回值——也就是 a + b 表达式的值——算是“右值”。

普通的引用——如 classA& 这样的——叫做“左值引用”,它们是不能引用右值对象的。所以 c 并不能用 a + b 的值(右值)作为初值,编译器在这里就报错了。

而 const 引用既可以引用左值对象也可以引用右值对象。


解决办法自然就是 classA(const classA&),这样的构造函数既能接收普通左值对象,也能接收右值对象,所以就能够编译了。

查看完整回答
反对 回复 2018-11-30
  • Rimas
    Rimas
    讲的太棒了!5星好评! 但实际上呢,如果我同时定义(重载)了const引用和非const引用,在运行过程中c=a+b执行的是非const引用,也就是说把a+b当作当作左值了?!这很令人费解。
  • 1 回答
  • 0 关注
  • 1241 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信