在c++中,初始化(Initialization)和赋值(assignment)是完全不同的两件事
在c++中,做初始化,用圆括号和用等号是等价的
拷贝构造(copy constructor):
T::T(const T&);
如果没有设置拷贝构造,系统会自动创建一个拷贝构造,该拷贝构造会复制你的每一个成员变量(包括变量、对象、数组等等)。是成员级别的拷贝!!不是字节级别的拷贝!!
memberwise成员级别的拷贝:会调用构造器,复制一份内存数据
bytewise:把所有的数据复制
在复制的时候,如果成员对象有拷贝构造,那么也会调用成员对象的拷贝构造,所以可能会造成递归调用。
如果成员中包含指针变量、引用(reference),则这些指针和reference也会别copy,从而可能会造成变量被修改,而且可能会由于拷贝构造而产生多次析构,造成内存分配问题
T::T(T t) 会造成死循环递归调用拷贝函数,c++编译器会报错
拷贝构造被调用的情况:(初始化,隐藏初始化)
1.函数传参(参数为对象,非指针,非引用)
2.常规初始化 A a = a1; A a(a1); (不是赋值,而是调用拷贝构造函数)
3.函数返回值
不要依赖编译器提供的默认copy constructor
如果不希望对象被copy,声明一个private copy constructor(初学者不建议,可能会造成很多问题)
如果这样做,那么这个对象不可以作为函数参数(对象的指针或引用可以)
java中没有拷贝构造这件事情
在一些情况下编译器可能对函数进行优化,从而不会调用copy构造()