如何理解复制构造函数的显隐式复制? 以下理解对吗?(1)形如ClassA objA objB,ClassA objA(objB)是显示复
如何理解复制构造函数的显隐式复制?
以下理解对吗?
(1)形如ClassA objA = objB,ClassA objA(objB)是显示复制,如果有自定义的复制构造函数,则会调用它;如果没有,则调用合成的复制构造函数.
(2)如ClassA objA = 某个构造函数形参类型(比如string s = "lala"), 非引用的形参和返回值,初始化顺序容器元素等都属于隐式复制,不管有木有自定义的复制构造函数,编译器都只会调用合成的复制构造函数.
(3)还有,两种复制形式都需要先创建临时对象再调用复制构造函数吗? C++ 复制控制 复制构造函数
[解决办法]
ClassA objA = objB,不叫复制,赋值,调用ClassA 中operator =操作,
ClassA objA(objB)复制。
1,如果你的类中没有定义,就会调用默认的赋值/复制构造方法
2,同上
3,没有什么会不会先创建临时对象,你要看你的参数类型方式,引用或者是你说所得直接Obj tempObj,这样就会产生一个副本即临时对象!
[解决办法]
记得c++ prime plus 上ClassA objA = objB也是复制构造
[解决办法]ClassA objA = objB是拷贝构造,你应该回去翻书了
lz的问题应该是第二个问题的地方
string s = "lala";
ClassA objA = s;
在ClassA有string单参构造的情况下,会隐式调用该构造函数,注意不是拷贝构造,而是直接构造
如果ClassA的string单参构造用explicit修饰,则ClassA objA = s;编译通不过,必须ClassA objA(s);才能进行构造,或者ClassA objA = ClassA(s);这种情况是拷贝构造
顺便,个人为更明确区分assign和copy construct,一般都是用赋值和拷贝构造而不用复制构造这个容易打错或读错的翻译
[解决办法]容器使用中,隐式复制,会调用元素的拷贝构造。
如果没有定义拷贝构造,会用系统默认的。对于元素包含指针类型的成员,这个会让你栽坑的。
[解决办法]我们应当记住,只要是类型名开头的语句,其中的等号就不是赋值运算符。
[解决办法]++
调用的是构造函数。
[解决办法]ClassA obj;//调用默认构造函数,
ClassA obj2 = obj;//用已有对象obj来创建新对象obj2,一个新对象obj2先前不存在,现在正被创建。在对象
//被定义的地方构造函数总是必须被调用。但是哪个构造函数呢?obj2是从现有的obj对象
//创建的,所以只有一个选择:拷贝构造函数
ClassA obj3(obj); //这个不用说了,显然是调用拷贝构造函数。
ClassA obj4 = 10; //这个就如8楼所说的等号不是赋值运算符,一个新对象obj4先前不存在,现在正在创建
//所以必须调用构造函数,恰巧,前面重载了构造函数ClassA(size_t n = 0):num(n){}
//加入没有重载构造函数,那这句就报错了。
ps:在对象以值传递到函数局部的时候才会产生临时变量。
ClassA obj;
ClassA obj2 = obj;
obj2 = obj;//这句和上面那句是不一样的。这个时候obj2已被创建,等号才是赋值运算符,不调用构造函数。