c++::拷贝构造函数

<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">一、【定义】:</span>

只有单个形参,而且该形参是对本类类型对象的引用(常用const修饰),这样的构造函数称为拷贝构造函数。拷贝构造函数是特殊的构造函数,创建对象时使用已存在的同类对象来进行初始化,由编译器自动调用。

二、【特征】:
1、它是构造函数的重载。
2它的参数必须使用同类型对象的引用传递。(思考为什么?

答:因为如果是普通的值传递的话,则会产生临时变量,调用拷贝构造函数,一直递归下去。而如果是利用引用传递的话,则因为引用就是你此时的实参,所以就不会产生临时变量,执行效率也会大大加快。
3、如果没有显式定义,系统会自动合成一个默认的拷贝构造函数。默认的拷贝构造函数会依次拷贝类的数据成员完成初始化。

三、【在下述三种情况下会调用拷贝构造函数】:

1. 对象以值传递的方式传入函数参数

classCExample
{
private:
 int a;
public:
 //构造函数
 CExample(int b)
 {
  a = b;
  cout<<"creat:"<<a<<endl;
 }
 
 //拷贝构造
 CExample(const CExample& C)
 {
  a = C.a;
  cout<<"copy"<<endl;
 }
 
 //析构函数
 ~CExample()
 {
  cout<< "delete:"<<a<<endl;
 }
     void Show ()
 {
         cout<<a<<endl;
     }
};
 
//全局函数,传入的是对象
voidg_Fun(CExample C)
{
 cout<<"test"<<endl;
}
intmain()
{
 CExample test(1);
 //传入对象
 g_Fun(test);
 return 0;
}<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);"> </span>

调用g_Fun()时,会产生以下几个重要步骤:
(1).test对象传入形参时,会先会产生一个临时变量;
(2).然后调用拷贝构造函数把test的值给这个临时变量;
(3).等g_Fun()执行完后, 析构掉 这个临时变量。

2. 对象以值传递的方式从函数返回

classCExample
{
private:
 int a;
 
public:
 //构造函数
 CExample(int b)
 {
  a = b;
 }
 
 //拷贝构造
 CExample(const CExample& C)
 {
  a = C.a;
  cout<<"copy"<<endl;
 }
 
     void Show ()
     {
         cout<<a<<endl;
     }
};
 
//全局函数
CExampleg_Fun()
{
 CExample temp(0);
 return temp;
}
intmain()
{
 g_Fun();
 return 0;
}

当g_Fun()函数执行到return时,会产生以下几个重要步骤:
(1). 先会产生一个临时变量
(2). 然后调用拷贝构造函数把temp的值给临时变量。
(3). 在函数执行到最后先析构temp局部变量。
(4).
等g_Fun()执行完后再析构掉临时变量对象。

3. 对象需要通过另外一个对象进行初始化;

CExample A(100);
CExample B = A;
// CExample B(A);

后两句都会调用拷贝构造函数。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值