我是C ++的新手(但对于编程并不陌生 - 我非常了解Java),所以这可能有一个我只是忽略的简单答案。
问题简而言之:写作之间有什么区别(如果有的话):
classType a = b;
并撰写
classType a; a = b;
特别是当
b
是函数中的引用变量且=
何时超载时?
详情/背景
我正在研究一个自定义vect
类,它将(最终)保存n个元组,其行为类似于R^n
中的向量(即数学样式向量,而不是STL样式向量) )。因此,我重载了=
运算符,将组件从rhs
复制到lhs
。
但是,我发现,当我的rhs是函数中的引用变量时,组合的声明/初始化使得rhs和lhs引用相同的对象 ,而单独的初始化将它们保持为不同的对象。
在我的下面的程序中,当我使用单行{{1}时,v2 = v1 * 10
导致v2
和v1
设置为v1*10
,结果证明了这一点我在vect a = b
的定义中写vect a; a=b
时表现得像预期的那样。
最小可编辑示例:
我为它的长度道歉,但是这一点在我第一次尝试的时候就减少了。我会继续寻找减少的方法。
问题出现在*
运算符的重载上。我在那里评论了展示问题需要做出哪些改变。
*
答案 0 :(得分:1)
区别在于vect a = b;
执行复制初始化,而vect a; a = b;
执行复制分配。复制初始化调用复制构造函数,而复制赋值调用重载的operator=
。
在您的代码中,您的复制赋值运算符会将一个向量的元素复制到另一个向量中,这很好。但是,您的复制构造函数只是将LHS的baseArray
设置为指向与RHS相同的内存块,而不复制任何向量元素。当两个指针指向同一个内存时,当然修改一个也会修改另一个内存。