C++提供的特殊成员函数
1.你未定义构造函数会生成默认构造函数
2.你未定义析构函数会生成默认析构函数
3.未定义拷贝构造函数时生成拷贝构造函数
4.赋值运算符=
5.&取地址运算符
拷贝构造函数使用
1.使用赋值运算符时=
2.进行值传递时,进行值传递意味会产生一份传递参数的拷贝。
3.产生临时变量时。
Class_name(const Class_name &);
例:
StringBad(const StringBad &);
以下四种情况都会调用拷贝构造函数
StringBad motto;
1.StringBad ditto(motto);
2.StringBad metto=motto;
3.StringBad also=StringBad(motto);
4.StringBad *pStringbad=new StirngBad(motto);
默认拷贝构造函数
会产生浅拷贝
例:StringBad sailor=sports;
等同于
StringBad sailor;
sailor.str=sports.str;
sailor.len=sprots.len;
1.如果成员变量有类类型,会调用该类的拷贝构造函数。
2.静态变量不受影响,因为它是类公用的。static
3.如果你定义了一个静态类变量会在构造函数调用时改变,应该编写对应的拷贝构造函数。
4.如果一个类成员变量包含指针被new初始化,你应该书写拷贝构造函数,避免默认拷贝构造函数仅进行指针赋值。对应于深拷贝。
赋值运算符
Class_name & Class_name::operator =(const Class_name &);
例:StringBad & StringBad::operator =(const StringBad &);
使用:
StringBad headline1("How are you");
StringBad knot;
knot=headline1;//调用赋值运算符
StringBad metto=knot;//调用拷贝构造函数
赋值运算符重载注意事项
1.使用delete[]释放空间
2.注意自我赋值的处理
3.返回引用
例:StringBad s0,s1,s2;
s0=s1=s2;//返回引用可以正常赋值
StringBad & StringBad::operator =(const StringBad &st){
if(this==&st)
return *this;//自我赋值
delete str[];//释放旧空间
len=st.len;
str=new char[len+1];
strcpy(str,st.str);
return *this;
}