什么是复制构造函数?
复制构造函数形如:
假设类为StringBad,其相应的构造函数为
StringBad(const StringBad &);
当使用一个对象初始化另一个对象的时候,编译器将自动生成上述函数
每当程序生成对象副本时,编译器都将使用复制构造函数
如一个函数为call(StringBad sb)sb为其副本,创建sb时就调用了该函数,这也就会造成如果某个类型中有
字符串时候,其副本因为浅拷贝的问题会指向与原类相同的地址,造成析构时,重复释放该地址内存。
假设motto是一个StringBad对象,则以下4种声明都将调用复制构造函数:
StringBad ditto(motto)
StringBad metoo=motto;
StringBad also=StringBad(motto);
String *pStringBad=new StringBad(motto);
最后一种是声明使用motto初始化一个匿名对象,并将新对象的地址赋给pstring指针
如何解决浅拷贝的问题呢?
自己定义复制构造函数,使其成为深拷贝,拿StringBad举例
假设StringBad{
char *str;
int len;
}
自定义: StringBad(const StringBad &st){
len=st.len;
str=new char[len+1];
std::strcpy(str,st.str);
}
这样就解决了该问题
转换函数:
用于实现从类类型到某种类型的转换,而某种类型到类类型的转换用构造函数就可以