zoukankan      html  css  js  c++  java
  • 构造函数与复制构造函数

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

    预备知识:

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

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

    • !!!浅复制 —— 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

  • 相关阅读:
    Codeforces Gym 100571A A. Cursed Query 离线
    codeforces Gym 100500 J. Bye Bye Russia
    codeforces Gym 100500H H. ICPC Quest 水题
    codeforces Gym 100500H A. Potion of Immortality 简单DP
    Codeforces Gym 100500F Problem F. Door Lock 二分
    codeforces Gym 100500C D.Hall of Fame 排序
    spring data jpa 创建方法名进行简单查询
    Spring集成JPA提示Not an managed type
    hibernate配置文件中的catalog属性
    SonarLint插件的安装与使用
  • 原文地址:https://www.cnblogs.com/starrys/p/11486850.html
Copyright © 2011-2022 走看看