关于对象数组初始化的问题
c++吧
全部回复
仅看楼主
level 3
最近刚开始学习c++,不太懂这个error。
2019年08月28日 08点08分 1
level 16
。。。复制构造写错了改成 Pint const&
2019年08月28日 08点08分 2
谢谢您,问题解决了。但是我有点搞不懂为什么在复制构造参数加const就可以不加就会报错。我在网上也查了以下,有说临时变量只能const引用,但从输出结果看这一行初始化应该没有调用过复制构造函数呀[泪]
2019年08月28日 09点08分
@嘿小黑子💤 用临时量构造Point数组时调用了拷贝构造函数,然而非const左值引用不能绑定到右值,有时候不报错是因为你那时用的左值来初始化Point[汗]
2019年08月29日 10点08分
@noelemahcz 多谢,我也觉得很有道理。但为什么输出结果里没有“复制构造了一个Point”呀[不高兴]
2019年08月29日 11点08分
@嘿小黑子💤 因为你是用右值初始化的 Point 对象,编译器应用了 copy elision,拷贝构造函数的调用被省略了(副作用也一同省略了),如同没有复制一样,源对象直接被当成目标对象来使用了,在你这里 Point(0, 0) 这个临时量直接当 p[0] 用了,Point(3, 4) 当 p[1] 用了。
2019年08月29日 14点08分
level 7
因为复制构造函数得确保你不会改变当前的值
2019年08月28日 14点08分 3
可是有些时候可以不写const的呀QAQ
2019年08月29日 03点08分
@嘿小黑子💤 vs比较严格
2019年09月01日 09点09分
level 8
不是复制构造函数写错了的问题,是因为花括号初始化列表中的值是一个右值而你的类中没有移动构造函数,所以会出现找不到合适构造函数的错误。
你只要为你的类新增一个移动构造函数就好了,具体做法是将你类中的复制构造函数的参数改为"Point&& p"就好了
顺便一提,你的复制构造函数的参数这么写是没问题的,只是我们常常加一个const来防止改变它而已,至于为什么加一个const你的代码就编译成功的,是因为c++允许将一个右值(rvalue)赋值给一个常亮左值(const lvalue)而已
2019年08月29日 09点08分 4
对不起[你懂的]应该把上面最后一句话改为c++允许将一个右值赋值给一个常量左值引用或左值
2019年08月29日 09点08分
非常感谢[真棒],不过还没有学移动构造函数,明天早起学一下嘻嘻。[呵呵]
2019年08月29日 11点08分
当没有移动构造函数是,即使传入右值,C++也会使用复制构造函数完成构造。复制构造是异常安全的,移动构造不一定。
2019年08月29日 15点08分
@Lhbgt 多谢,明白了[呵呵]
2019年08月30日 02点08分
level 8
顺便说一下,你说的临时变量其实就是右值
2019年08月29日 09点08分 5
1