zoukankan      html  css  js  c++  java
  • 拷贝构造函数

    拷贝构造函数

    一、什么是拷贝构造函数?

    1.1 浅拷贝

    先来了解点预备知识,浅拷贝。所谓浅拷贝,指的是在对象复制时,只对对象中的数据成员进行简单的赋值,默认拷贝构造函数执行的也是浅拷贝。大多情况下“浅拷贝”已经能很好地工作了,但是一旦对象存在了动态成员,那么浅拷贝就会出问题了
    

    1.2 拷贝构造函数

    拷贝构造函数是一种特殊的构造函数,它在创建对象时,是使用同一类中之前创建的对象来初始化新创建的对象

    如果没有构造函数,会自动定义,如果有指针变量且带有动态内存分配就必须自己写一个。

        classname(const classname &obj)
        {
        }

    二、在哪里使用到拷贝函数?

    1. 作为参数传递给函数
    2. 对象需要通过另外一个对象进行初始化
    3. 从函数返回对象

    2.1 作为参数传递给函数

    void display(ClassName obj)
    {
       cout << "Length of line : " << obj.getLength() <<endl;
    }

    注解:当对象作为参数传递过来的时候,先产生一个temp对象,调用拷贝构造函数,当作用域结束的时候(就是函数结束),调析构。

    2.2 对象需要通过另外一个对象进行初始化

       Line line1(10);
       Line line2 = line1; // 这里也调用了拷贝构造函数

    2.3 从函数返回对象

    //全局函数  
    CExample g_Fun()  
    {  
     CExample temp(0);  
     return temp;  
    }  

    (1). 先会产生一个临时变量,就叫XXXX吧。
    (2). 然后调用拷贝构造函数把temp的值给XXXX。整个这两个步骤有点像:CExample XXXX(temp);
    (3). 在函数执行到最后先析构temp局部变量。
    (4). 等g_Fun()执行完后再析构掉XXXX对象。

    • 特别注意: 当我使用gcc进行编译的时候发现,返回对象自动调用复制拷贝函数的机制没有执行,经过查阅资料发现是由于gcc具有返回值优化,我们要看见结果只需要在编译时候加入参数:-fon-elide-constructors
        g++ -fon-elide-constructors main.cpp
  • 相关阅读:
    RSA算法
    随机数相关面试题
    黑冰
    Servlet
    中国文人的弱点
    黑客与画家
    J2SE、JS及JavaWeb的若干知识
    离婚前规则
    自己写的一个智能指针类
    用_makepath和_splitpath构造路径&分解路径
  • 原文地址:https://www.cnblogs.com/pzqu/p/9457627.html
Copyright © 2011-2022 走看看