——复制构造函数用于将一个对象的值复制到新建立的对象中,用于初始化过程当中(包括按值传递参数),而不是常规的赋值过程当中函数
Class_name(const Class_name &)
StringBad ditto(motto); // calls StringBad(const StringBad &) StringBad metoo = motto; // calls StringBad(const StringBad &) StringBad also = StringBad(motto); // calls StringBad(const StringBad &) StringBad * pStringBad = new StringBad(motto) // calls StringBad(const StringBad &)
中间两种声明可能会使用复制构造函数直接建立metoo和also,也可能使用复制构造函数生成一个临时对象,而后将临时对象的内容赋给metoo和also,这取决于具体的实现spa
——默认的复制构造函数逐个复制非静态成员(成员复制也称为浅复制),复制的是成员的值指针
StringBad sailor = sports; //等效于 StringBad sailor; sailor.str = sports.str; sailor.len = sports.len;
只是因为私有成员是没法访问的,所以后面的代码不能经过编译对象
静态对象不受影响,由于它们属于整个类,而不是各个对象blog
默认的复制构造函数不说明其行为(全盘复制),若是须要在构造函数中修改类静态数据成员,这时就会发生错误生命周期
解决办法:提供一个显示复制构造函数内存
StringBad::StringBad(const String &s) { num_strings++; // static int num_strings声明在类中 ... // imported stuff to go here }
若是类中包含这样的静态数据成员,即其值将在新对象被建立时发生变化,则应该提供一个显示复制构造函数字符串
隐式复制构造函数的浅复制(复制指针)致使的内存问题原型
解决办法:定义一个显示复制构造函数,进行深度复制编译器
StringBad::StringBad(const StringBad &st) { num_strings++; // handle static member update len = st.len; // same length str = new char [len + 1]; // allot space std::strcpy(str, st.str); // copy string to new location ... }
复制字符串并将副本的地址赋给str成员
若是类中包含了使用new初始化的指针成员,应当定义一个复制构造函数,以复制指向的数据,而不是指针,这被称为深度复制。复制的另外一种形式(成员复制或浅复制)只是复制指针值。浅复制仅浅浅地复制指针信息,而不会深刻“挖掘”以复制指针引用地结构