将声明和初始化与重载的`=`结合起来

时间:2014-01-28 01:48:35

标签: c++ initialization operator-overloading assignment-operator

我是C ++的新手(但对于编程并不陌生 - 我非常了解Java),所以这可能有一个我只是忽略的简单答案。

  

问题简而言之:写作之间有什么区别(如果有的话):

classType a = b;
     

并撰写

classType a;
a = b;
     

特别是当b是函数中的引用变量且=何时超载时?

详情/背景

我正在研究一个自定义vect类,它将(最终)保存n个元组,其行为类似于R^n中的向量(即数学样式向量,而不是STL样式向量) )。因此,我重载了=运算符,将组件从rhs复制到lhs

但是,我发现,当我的rhs是函数中的引用变量时,组合的声明/初始化使得rhs和lhs引用相同的对象 ,而单独的初始化将它们保持为不同的对象

在我的下面的程序中,当我使用单行{{1}时,v2 = v1 * 10导致v2v1设置为v1*10,结果证明了这一点我在vect a = b的定义中写vect a; a=b时表现得像预期的那样。

最小可编辑示例:

我为它的长度道歉,但是这一点在我第一次尝试的时候就减少了。我会继续寻找减少的方法。

问题出现在*运算符的重载上。我在那里评论了展示问题需要做出哪些改变。

*

1 个答案:

答案 0 :(得分:1)

区别在于vect a = b;执行复制初始化,而vect a; a = b;执行复制分配。复制初始化调用复制构造函数,而复制赋值调用重载的operator=

在您的代码中,您的复制赋值运算符会将一个向量的元素复制到另一个向量中,这很好。但是,您的复制构造函数只是将LHS的baseArray设置为指向与RHS相同的内存块,而不复制任何向量元素。当两个指针指向同一个内存时,当然修改一个也会修改另一个内存。