C++三巨头原则

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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值