C++之析构函数/拷贝构造函数/拷贝赋值函数的概念和使用

来源:互联网 发布:剑三萝莉捏脸数据南风 编辑:程序博客网 时间:2024/05/17 01:59

 1.析构函数

        构造函数:当对象被创建时,自动调用构造函数进行初始化,
                     如果没有自定义的构造函数,那么系统会自动提供一个缺省构造函数
     析构函数: 当对象被销毁时,自动调用析构函数进行资源的回收,
                        如果没有自定义析构函数,那么系统会自动提供一个缺省析构函数

  1.1格式

     class 类名
     {
      ~类名(void)//不需要任何参数
      {
      析构函数体;
      }//说明析构函数没有重载
     };
     构造函数和析构函数 又叫做:析构器,构造器
     注意:
         (1)析构函数用于回收资源,对于栈区的普通对象来说,当生命周期结束的时候自动调用析构函数,而对于堆区中的对象,当delete时调用析构函数(见代码 01destruct.cpp)

    1.2 缺省析构函数

             (1)如果一个类中没有提供析构函数,那么系统会自动提供一个缺省析构函数,该析构函数会调用成员变量以及基类的析构函数(见代码 02destruct.cpp)
        (2)系统提供的缺省析构函数不能释放动态内存资源,此时需要自定义析构函数来释放资源,当然释放的资源不仅仅是动态内存,还可以进行文件的关闭,socket的关闭等(见代码 03destruct.cpp)

 2.拷贝构造函数

    2.1 格式

    class 类名
    {
    类名(const 类名& 变量名)//必须要加引用,否则实参到形参发生拷贝即开始不断的调用自身
    {
    拷贝构造函数体;
    }
    };如:    Student::Student(const Student&)//拷贝构造函数
    注意:
        a.一个类中没有自定义拷贝构造函数时,系统会自动提供一个缺少拷贝构造函数,功能就是进行字节的复制从而拷贝一个与拷贝源一模一样的副本(见代码04copyStruct.cpp)
        b.缺省拷贝构造函数的字节复制往往不能事项对象之间的深拷贝,这时需要我们自定义拷贝构造函数以获得真正意义上的副本(见代码05copyStruct.cpp)

    2.2 拷贝构造的时机

         (1)用同类型的对象初始化另外一个新对象

        (2)函数调用时传递对象作为参数(传递的不是对象的引用的时候)

        (3)函数返回对象(受编译器优化的影响)

    2.3 拷贝赋值函数(见代码 07copyAssign.cpp)

        (1)格式

           class 类名
           {
            类名& operator=/*整体为函数名*/(const 类名& 对象名)
            {
            //拷贝赋值函数体
            }
           };

        (2)注意:

                       a.一个类中没有自定义拷贝赋值函数时,系统会自动提供一个缺省拷贝赋值函数,功能就是进行字节的复制从而对源对象进行赋值
              b.当类中有动态内存时需要自定义拷贝赋值函数

  (3)自定义拷贝赋值函数注意

        a.先释放已有的资源之后再从拷贝源中拷贝数据
       b.防止自赋值
       c.返回自引用,支持连续赋值

  
0 0
原创粉丝点击