复制构造函数和operator=

本文详细解释了构造函数在C++中的作用及其如何初始化对象的过程。同时介绍了编译器默认提供的构造函数类型,以及当程序员自定义构造函数时编译器的行为变化。

首先,说说构造函数。构造函数的作用:无论构造函数隐式还是显式被调用,编译器都会生成代码生成一个对象,然后会用构造函数的初始化列表中的值初始化对象,初始化完毕行会执行构造函数体中的代码。

例如可以显式调用一个类的构造函数来生成该类的一个对象。
cout<<string("i love cpp"); //使用string类的构造函数产生一个string类的临时对象

===

编译器默认为类提供:空参数的构造函数,拷贝构造函数,赋值操作符operator=,析构函数。

如果程序员提供了构造函数(包括拷贝构造函数),编译器将不再生成零参数的构造函数。

如果程序员显式实现了拷贝构造函数,那么编译器将不再生成,成员变量拷贝工作,全部由程序员来负责。

如果程序员实显式实现了类的operator=,那么系统将不在自动生成,成员变量的赋值工作,全部由程序员来负责。

如果程序员自己实现了析构函数,那么编译器将不再自动生成。

一个好的编程习惯是:任何时候都自己去显式提供零参数的构造函数。

===

如果程序员没显式的自定义一个复制构造函数,赋值操作符或析构函数,编译器会生成这些未定义操作的默认版。默认版的函数定义为递归操作,即根据元素类型的适当规则、复制、赋值或者销毁数据。见《accerlated c++ 》p179.

 



class C
{
 public:
  C()
 {
  i = 77;
 }

 C(int init)
 {
  i = init;
 }


 C& operator=(const C & x)
 {
 }

 
  int i;
};

int main()
{
 C c1;
 cout<<c1.i; //77

 C c2(88);
 cout<<c2.i; //88
 c1 = c2; //赋值操作,因为自己实现了,编译器将不再提供
 cout<<c1.i;  //注意,输出结果是77而不是88
 
}

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值