复制构造函数(拷贝构造函数)在什么情况下被调用

什么是复制构造函数:

        复制构造函数是一种特殊的构造函数,具有一般构造函数的所有特性 ,它的形参是本类的对象的引用,比如(类名   对象名)。它的作用是使用一个已经存在的对象(此对象由复制构造函数的参数决定),去初始化同类的一个新对象。那么复制构造函数一般在什么情况下被调用呢,有三种情况:

(1)当用类的一个对象去初始化该类的另一个对象的时候

:   int  main()

          {

                    Point  a(1,2);              // 调用类的构造函数(Point类)

                    Point  b(a);                 // 用已存在的对象a初始化新对象b,复制构造函数被调用

                    Point c=a;                  // 用已存在的对象a初始化新对象c,复制构造函数被调用

                    return 0;

           }

(2)如果函数的形参是类的对象,调用此函数的时候,进行形参和实参相结合时,复制构造函数被调用

例:    void f(Point  p)

         {

               cout<<p.getX()<<endl;

         }

         int main()

         {

                Point  a(1,2);

                f(a);                                         // 函数的形参为类的对象,当调用函数时,实参与形参结合,复制构造函数被调用

                return 0;

          }

                注意:只有把对象用值传递的时候,才会调用复制构造函数,如果传递引用,则不会调用复制构造函数。

(3)如果函数的返回值是类的一个对象,函数执行完成返回调用者时,复制构造函数被调用

:         Point  g()

             {

                       Point  a(1,2);

                       return a;                            // 函数的返回值是类的对象a,返回函数值时,复制构造函数被调用

             }

            int main()

            {

                       Point  b;

                       b=g();

                       return  0;

             }

              注意:这种情况下,表面上函数g将a返回给了主函数,但是a是g()的局部对象,离开建立他的函数g以后a就不存在了,不可能在返回给主函数后继续生存,所以在处理这种情况的时候编译器系统会在主函数中创建一个无名的临时对象,该临时对象的生存期只在函数调用所处的表达式中,也就是表达式 b=g() 中。执行语句“ return a ”时,实际上是调用复制构造将a的值复制到临时对象中,所以在此调用了复制构造函数。函数g运行结束时对象a消失,但临时对象会存在于表达式“ b=g()”中。计算完这个表达式后,临时对象的任务也就完成了,改临时对象就会自动消失。

        以上便是复制构造函数经常被调用的三种情况。下面我写一下类Point,便于大家参考。

class  Point

{

   public:

            Point (int xx=0, int yy=0)                 // 构造函数,带有形参

            {                 

                          x=xx;   y=yy;           

            }

            Point (Point &p);                           // 复制构造函数

            int getX() {   return x;   }

            ..........

   private:

             int x , y;

};

Point::Point(Point  &p)                 // 复制构造函数实现

             x=p.x;

             y=p.y;

}

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

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:编程工作室 设计师:CSDN官方博客 返回首页
评论

打赏作者

Coder-L

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值