构造函数,默认构造函数,复制构造函数,赋值构造函数

构造函数、复制构造函数和赋值操作符在生成对象和对象之间的复制时用到。如果类中没有显式定义这三种函数,那编译器通常会为我们定义(合成)。如果类中定义了一个带参数的构造函数,那么编译器就不会再自动合成默认构造函数(空参数的构造函数),这需要我们显式定义。C++ Primer中对复制控制操作讲述得比较多,要理解起来还得动手实际的操作一下,看看编译器是如何实现这些操作的,下面的操作使用VC++6.0编译器。


#include <iostream>
using namespace std;

class classA
{
public:
classA()      //默认构造函数
{
}
classA(int a)      //带参数的构造函数
{
}
classA(const classA& ma)       //复制构造函数
{
}
classA &operator=(const classA& ma)      //赋值操作符
{

   this->num = ma.num;

   return *this;
}
~classA()      //析构函数
{
}
void print()      //成员函数
{
}
private:
int num;       //数据成员
};

int main()
{
classA obj1;                  

classA obj2(1);               

classA *pobj3 = new classA;   

classA(2);                    

classA obj4(obj2);           

classA obj5 = obj2;          

classA obj6 = classA(3);     

classA obj7 = classA(obj2);     

obj1 = obj2;              

obj1 = classA(obj2);      

obj1 = classA(6);       

classA obj8 = 8;         

obj8 = 9;       

return 0;
}

      总结:定义一个类类型的对象,总会使用构造函数生成一个对象的空间。调用哪种构造函数(默认构造函数、带参数的构造函数和复制构造函数)根据传入的实参决定。空参数就调用默认构造函数(如语句1),单个本类类型参数的就调用复制构造函数(如语句5),其它参数形式调用对应的类中定义的构造函数(如语句2)。如果对象已经存在,两个对象之间的赋值操作调用的是赋值操作符(如语句9)。

      C++ Primer 第四版中文版409的13.1.2中说复制构造函数“因为用于向函数传递对象和从函数返回对象,该构造函数一般不应该设置为explicit”,想了半天这句话,没有一个所以然来。实际操作一下:
      在VC++6.0编译器中,尝试在复制构造函数前面加上explicit修饰(explicit classA(const classA& ma)),如果不执行classA obj5 = obj2这种类型的复制初始化操作,可以编译通过。如果有这条语句就会报“cannot convert from 'class classA' to 'class classA'。No copy constructor available for class 'classA'”,这个错误提示模糊,很难理解。
      在VC++2008(VC9.0)编译器中,尝试在复制构造函数前面加上explicit修饰,如果不执行classA obj5 = obj2这种类型的复制初始化操作,还是可以编译通过。如果有这条语句就会报“ no copy constructor available or copy constructor is declared 'explicit'”,这个错误提示就明晰很多。
      通过上述的理解,如果构造函数(带单参数的构造函数和复制构造函数)前面用explicit修饰:explicit classA(Type a),其中Type是参数类型。那么编译器就会不执行这种类型的操作:classA obj = a,只能是显式的使用直接初始化操作:classA obj(a) 。这样子就能够解释为什么复制构造函数不应该修饰为explicit了,这是由于按照使用习惯,复制构造函数可以采用复制初始化形式执行(语句6)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值