拷贝构造函数

为什么要有拷贝构造函数?

看下面代码:

 #include <iostream.h>

 

class TEST

{

      TEST(int i)

     {

         cout<<"Constructing with"<<i<<"./n";

         value = i;

         return;

     }

 

     ~TEST()

     {

        cout<<"Destructing./n";

     }

     int get()

     {

        return value;

     }

private:

      int value;

}

 

void display(TEST obj)

{

    cout<<"Display With"<<obj.get()<<"./n";

    return;

}

 

int main()

{

   TEST explorer(5);

 

   display(explorer);

   return 0;

}

 

该程序的输出结果是:

    Constructing with 5.

    Display with 5.

    Destructing.

    Destructing.

 

从这个结果中我们可以看到, 构造函数被执行了一次,但是析构函数却被执行了两次, 这样是有问题的,如果我们在构造函数中进行了new,在析构函数中进行了delete的话,那么这样的话就会出现内在泄漏了. 为什么会出现这种现象呢? 因为当display被调用的时候进行的是值传递, 首先会创建一个obj的副本, 然后将该函数传递给display,函数调用结束后该副本被撤销. 但是创建副本时没有调用构造函数(没有合适的构造函数可供调用.), 销毁时却调用了析构函数. 解决这个问题有两个方法,一个是将函数display()设计成按引用调用,这样不用生成副本. 另一个是定义一个拷贝构造函数,生成对象副本时将调用拷贝构造函数进行初如化.

 

为什么参数是&?

防止生成副本,否则死循环,不停调用拷贝构造函数.

如果你不写,编译器是否会为你生成一个默认的拷贝构造函数?

会.但是它进行的只是浅拷贝.

 

关于派生类构造函数与基类构造函数的调用关系的问题:

  派生类不带参数的构造函数会自动调用基类中不带参数的构造函数. 派生类中有参构造函数如果你不指定怎么调用基类的构造函数的话,它会调用默认的无参构造函数.

 

关于派生类拷贝构造函数与基类拷贝构造函数的调用关系的问题:

如果它们都没有定义~,则编译器会调用它们的默认~.

如果它们都定义了~,但你在定义派生类~时没有显示调用基类的~,那么编译器会调用基类的默认的无参构造函数. 如果显示调用了基类的~,则会被调用.

如果基类定义了~但派生类没定义~,则编译器会调用基类的~.

如果基类没定义但派生类定义了.则编译器会调用基类的默认无参构造函数.

 

 

 

1 拷贝构造函数为private的目的?

   深浅拷贝.

2 拷贝构造函数中可以访问同类的其它对象的私有成员.

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值