如果我错了,请纠正我,但我的理解是当你这样做时使用了复制构造函数:
myClass newInstant = oldInstant;
当您执行此操作时使用赋值运算符:
myClass newInstant;
newInstant = oldInstant;
我相信两者都会达到相同的结果,但第一个更直接,因为它首先避免使用构造函数然后复制新数据。
我不确定的是,当函数通过引用而不是通过引用传递时,它是使用复制构造函数还是使用赋值运算符复制的。此外,从函数返回瞬间时使用。
通常,在哪些情况下使用了复制构造函数和赋值运算符?
最后一个问题,如何在不复制的情况下返回值?如果返回的瞬间是副本并且旧的瞬间被删除,我将如何解决这个问题以提高效率?
由于
答案 0 :(得分:2)
复制构造函数,如示例所示:
vClass oldInstant;
yClass newInstant = oldInstant; // invoking copy constructor
赋值运算符用于指定一些东西,比如说现有对象是另一个现有对象。
myClass newInstant; // invoking myClss constructor. so from now and on newInstant is already existing object;
newInstant = oldInstant; //oldInstant is also an already existing object. now assign one object to another. (assigning oldInstant to newInstant)
请记住,它们的使用完全不同,但每个都有自己的用途。 ***有时我们想要创建一个对象并将其分配给另一个现有的(复制构造函数),因为我们可能希望保存原始对象并在副本上执行某些操作。
***赋值运算符我们无法避免使用它!!你可以在没有等于运算符'='???
的数学中进行一些计算复制构造函数和赋值运算符应该做的事情:
***复制构造函数应该使用“深拷贝”而不是“浅拷贝”时有一些 堆上的内存(使用'new'关键字分配的指针)
这只是一些解释,但你应该在提出之前进行更多搜索,因为会员会对你投反对票。
答案 1 :(得分:0)
从技术上讲,在以下情况下会调用复制构造函数:
实现赋值运算符以使用新内容删除现有实例的旧内容。当你展示一个例子时:
myClass newInstant;
newInstant = oldInstant;//assignment operator
请记住,它们的工作方式不同。复制交换涉及赋值运算符。
关于你的上一个问题,现代编译器应用复制构造函数elision来消除不必要的复制构造函数调用。