概述
C++三巨头原则
BIG THREE:
- copy ctor
- copy=
- dtor
complx c1(0,0);//构造函数
complex * pc = new complex;//构造函数
complex c2(c1);//拷贝构造函数
complex c3 = c1;//拷贝构造函数
c3 = c2;//赋值构造函数
delete pc;//析构函数
copy ctor
-
如果不自定义拷贝构造函数,编译器自带的是bit-wise copy,即浅拷贝
-
如果一个类数据成员有指针变量,必须手动实现拷贝构造函数!!
-
拷贝构造的意思是原来的对象不存在,因此如果类内成员有指针变量,那么必须手动分配空间
class string {
private:
char * m_data;
public:
string(const string & str){
m_data = new char[strlen(str.m_data) + 1];
strcpy(m_data,str.m_data);
}
}
copy=
- 拷贝赋值函数本质上就是重载操作符
=
,因此函数具有返回类型,为了考虑到连续赋值,返回类型应当是value或者引用,为了速度,最后选择引用。 - 拷贝赋值函数发生在已存在的对象中,如果类内成员变量有指针类型(指向一块内存),需要将这块内存清除
- 因为需要将对象原来的内存清除,则拷贝赋值函数一定要考虑到自引用检查!!!
inline string &string::operator=(const string &str){
if(this==&str){//检查
return *this;
}
delete [] m_data;//假设构造函数是使用new操作符
m_data = new char[strlen(str.m_data) + 1];//如果没有检查自引用,则上面语句已经把str的m_data销毁了
strcpy(m_data,str.m_data);
return *this;
}
dtor
- 析构函数发生在对象被销毁的时候
return compelx& foo(){
complex c1(0,0);//c1申明在栈上
return c1;
}//c1的生命周期结束,调用c1的析构函数
int main(){
complex & zero = foo();//foo返回的是一个生命周期已经结束的引用,会发生错误!!调用foo()也就意味着调用了c1的析构函数(发生在return c1之后)
return 0;
}
最后
以上就是复杂黑夜为你收集整理的C++三巨头原则C++三巨头原则的全部内容,希望文章能够帮你解决C++三巨头原则C++三巨头原则所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复