C++中复制构造函数被调用的三种情况

C++中的构造函数

c++中的构造函数分为构造函数,和复制构造函数,相比于构造函数,复制构造函数使用更加方便,快捷。构造函数可以有多个,二复制构造函数只能有一个,因为复制构造函数的参数
只能是当前类的一个对象,参数表是固定的,无法重载,若用户没有定义自己的辅助构造函数,系统会自动生成一个复制构造函数,其作用是将参数的之赋予当前的对象.若用户自己定义了复制构造函数,系统则不会生成默认复制构造函数。用户自己定义的复制构造函数功能可以自己构造,不一定执行复制的功能。

复制构造函数同构造函数的功能大体相同·,却又有不同之处,下面介绍复制构造函数在3中情况下的调用
1.当用一个对象去初始化同类的另一个对象时,会引发复制构造函数的调用

以下两条语句都会导致复制构造函数的调用

     Complex c1(c2);
     Complex c1=c2;

这两条语句时等价的,其中第二句是初始化语句,不是赋值语句

下面这一条语句不会调用复制构造函数

     Complex c1,c2;
     c1=c2;

2.作为形参的对象,使用复制构造函数初始化的
以下语句可以证明


    #include<iostream>
    using namespace std;
    class A{
     public:
        A(){};//构造函数
         A(A&a)//复制构造函数
        {
            cout<<"Copy constructer called"<<endl;
        }
      };
      void Func(A a)//普通函数
     {

     }
     int main()
      {
      A b;
      Func(b);//此语句相当于是将b复制给Func(a)中的a,导致调用复制构造函数
      retur 0;

      }

程序运行截图

3.如果函数返回的是类A的对象,那么函数返回时,类A的复制构造函数会被调用
程序如下

     #include<iostream>
     using namespace std;

     class A{
     public:
       int v;
       A(int i){
           v=i;
        };//构造函数
        A(A&a)//复制构造函数
        {
            cout<<"Copy constructer called"<<endl;
         }
      };
       A a(4);
       A Func()//普通函数
       {

          return a;
       }
        int main()
        {
        cout<<Func().v<<endl;//此语句中的Func()是一个类A的对象,但是不是a,只是用a初始化。
        return 0;

      }

以上三种情况是比较常见的复制构造函数被调用的例子

欢迎讨论,斧正

原文地址:https://www.cnblogs.com/liveformyself/p/11571772.html

时间: 2024-11-08 19:42:21

C++中复制构造函数被调用的三种情况的相关文章

链表中插入一个节点的三种情况

在链表中插入一个元素可以分为三种情况: 1.在节点的时候 2.在链表中间的任意位置 3.在链表的最后位置,也可以认为这种情况为追加(这个就留到追加的时候来实现) 下面是代码的实现 SN *Insert_S_Node( SN *head ) /* 传入的参数是被插入链表中的头指针 */ { SN *Insert_Node=NULL, *Dest_Node = NULL; /* Insert_Node是将要做成的新链表中的节点 Dest_Node是要插入的节点*/ INT32 OSM = 1, i3

Html5 页面中 JavaScript 启动调用的三种方法比较

太阳火神的美丽人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业用途-保持一致"创作公用协议 转载请保留此句:太阳火神的美丽人生 -  本博客专注于 敏捷开发及移动和物联设备研究:iOS.Android.Html5.Arduino.pcDuino,否则,出自本博客的文章拒绝转载或再转载,谢谢合作. 首先,来看一下 Html5 页面引用 JavaScript 代码的几种方式: 1.Html5 页面中使用 <script>  标签容纳

SpringBoot2.0.2 Application调用的三种方式

一.注解 @SpringBootApplication            点开查看源码是由多个注解合成的注解,其中主要的注解有:            @SpringBootConfiguration            @EnableAutoConfiguration            @ComponentScan 三个关键的注解:             @ComponentScan 自动扫描加载进来的包,-----------可以扫描自动加载的bean            @E

Node.JS的表单提交及OnceIO中接受GET/POST数据的三种方法

OnceIO 是 OnceDoc 企业私有内容(文档)管理系统的底层Web框架,它可以实现模板文件.静态文件的全缓存,运行起来完全不需要I/O操作,并且支持客户端缓存优化,GZIP压缩等(只压缩一次),拥有非常好的性能,为您节约服务器成本.它的模块化功能,可以让你的Web进行分布式存储,在一个扩展包里即可包含前端.后端和数据库定义,只需通过添加/删除目录的方式就可实现功能删减,实现真正的模块化扩展.目前 OnceIO 已经开源,本文主要介绍node.js语言中的表单提交及OnceIO中接受GET

js(20140517)在JS方法中返回多个值的三种方法

在JS方法中返回多个值的三种方法 在使用JS编程中,有时需要在一个方法返回两个个或两个以上的数据,用下面的几种方法都可以实现: 1 使用数组的方式,如下: <html> <head> <title>JS函数返回多个值--oec2003</title> </head> <body> <input type="button" onclick="getNames()" value="t

VBS中解决路径带空格的三种方法

vbs中,如果需要运行的程序中带有空格,按照通常的方式往往会提示错误,其实有两种形式不同的解决方法: 在应用程序前后分别加三个双引号,代码如下: [c-sharp] view plaincopyprint? Set wshell=CreateObject("WScript.Shell") wshell.Run  """C:/Program Files/360/360se/360se.exe""",5,True Set wshe

Velocity中加载vm文件的三种方式

Velocity中加载vm文件的三种方式: a.  加载classpath目录下的vm文件 Properties p = new Properties(); // 加载classpath目录下的vm文件 // 这里是加载模板VM文件,比如:/META-INF/template/Web_B2CPayment.vm(请参考mas_spring_integration.xml) p.setProperty("file.resource.loader.class", "org.apa

Struts2+Urlrewrite实现伪静态化 demo中介绍了三种情况的配置,下载即可运行。

原文:Struts2+Urlrewrite实现伪静态化 demo中介绍了三种情况的配置,下载即可运行. 源代码下载地址:http://www.zuidaima.com/share/1550463499504640.htm 为大家提供了3种模式的url进行访问,以便应付大家的开发,更多的模式大家可以自行组合. html:http://localhost:8686/Sturts2UrlReWrite/line.html xxx::http://localhost:8686/Sturts2UrlReW

(转)在网页中JS函数自动执行常用三种方法

原文:http://blog.sina.com.cn/s/blog_6f6b4c3c0100nxx8.html 在网页中JS函数自动执行常用三种方法 在网页中JS函数自动执行常用三种方法 在HTML中的Head区域中,有如下函数: <SCRIPT   LANGUAGE="JavaScript">   functionn MyAutoRun() {   //以下是您的函数的代码,请自行修改先! alert("函数自动执行哦!");   } </SCR