• 构造函数与复制构造函数


    在复制构造函数中的引用符,时有时不有,初学时不易理解,做点小归纳:

    预备知识:

    • 当类中没有定义任何构造函数(包括复制构造函数)时,编译器将生成默认构造函数

    • 当类中没有定义复制构造函数时,编译器将生成默认复制构造函数

    • !!!浅复制 —— https://www.cnblogs.com/starrys/p/11783019.html

    • 复制构造函数主要用途是避免浅复制所带来的坏的影响

      • 如果对象中有主动分配的内存时,在对象被析构释放分配的内存时,避免出现重复释放(当函数调用结束时,形参指向的空间已经被析构掉,当实参生存期结束也被析构,这个时候会出现重复释放同一块内存区域的错误)
      • 避免函数内部通过形参误修改函数外部实参指向的数据;

    调用函数的形参带不带引用符:

    1. 若形参带引用符号时,则为引用传递,不进行实例化对象

    2. 若形参不带引用符号,则为值传递,实例化一个形参对象,并用实参进行初始化

    ​ a. 若没有复制构造函数,则在值传递过程出现浅复制。

    ​ b. 若存在复制构造函数,复制构造函数将会帮我们深复制。

    TALK IS CHEAP , SHOW YOU CODE:

    需要的代码如下,后面根据不同情况做点小更改,就不再复制粘贴了;

    class MAN {
    public :
    	int *arr;
    	int size;
    	MAN(const MAN  & m);               //复制构造函数
    		
    	MAN( ) {                                        //构造函数
    		cout << "-----------construct" << endl;
    		arr = new int[20];
    		size = 20; 
    	}
    
    	~MAN( ) { delete[ ]arr; } // 析构
    };
    //MAN::MAN(const MAN &m) {
    //	cout << "-----------copy construct" << endl;
    //	arr = new int[20];
    //	size = m.size;
    //	memcpy(arr, m.arr, 20);
    //}
    void dis(MAN &x) {
    	cout << "	in  disssssss" << endl;
    	x.size = 666;
    	cout << x.arr << endl;
    	cout << "	out  disssssss" << endl;
    }
    int main( ) {
    	MAN s;
    	cout << s.size << endl;
    	cout << s.arr << endl;
    	dis(s);
    	cout << s.size << endl;
    	cout << s.arr<< endl;
    }
    
    

    1. 若调用函数的类参数带引用符号时,则为引用传递,则此时不进行实例化对象

         声明复制构造函数,注释定义,此时不调用复制构造函数
    

    2. 若调用函数的类参数不带引用符号,则为值传递,实例化一个形参对象,并用实参进行初始化

    • 若没有复制构造函数,则在值传递过程出现浅复制(只将数据成员进行传值复制),出现重复析构;

         复制构造函数注释定义,并将dis参数表中&符去掉;
      


    链接时出错,说明需要调用复制构造函数

          将复制构造函数全注释,并将dis参数表中&符去掉;则使用编译器默认的复制构造函数,出现浅复制                
    


    运行到主函数结尾,重复析构出现异常。

    • 若存在复制构造函数,

                 将复制构造函数全解注释,并将dis参数表中&符去掉;
      


    程序运行正常

    感兴趣想要阅读更多请参考这篇博文https://www.cnblogs.com/alantu2018/p/8459250.html

  • 相关阅读:
    奥展项目笔记12-批量下载文件
    深度学习笔记03-梯度下降和方向传播
    深度学习笔记02-高效计算基础(python)
    深度学习笔记01-数学基础
    解决Android Studio卡在Gradle:Resolve dependecies 'app:_debugCompile'问题
    Oracle DB , 计算各个用户/schema 的磁盘占用空间
    转载:删除github上文件夹的两种方式
    Win7无法保存共享帐户密码
    怎么做网线,网线水晶头接法和线序
    QQ Protect 的删除
  • 原文地址:https://www.cnblogs.com/starrys/p/11486850.html
Copyright © 2020-2023  润新知