• 类和对象:复制构造函数


    形如 X::X( X& )X::X(const X &), 二选一,后者能以常量对象作为参数

    • 如果没有定义复制构造函数,那么编译器生成默认复制构造函数。默认的复制构造函数完成复制功能。
      例1
    class Complex {
    private:
    	double real, imag;
    };
    Complex c1; //调用缺省无参构造函数
    Complex c2(c1);//调用缺省的复制构造函数,将 c2 初始化成和c1一样
    
    • 如果定义的自己的复制构造函数,则默认的复制构造函数不存在。
      例2
    class Complex {
    public:
    	double real, imag;
    	Complex() { }
    	Complex(const Complex & c) {
    		real = c.real;
    		imag = c.imag;
    		cout << "Copy Constructor called";
    	}
    };
    Complex c1;
    Complex c2(c1);//调用自己定义的复制构造函数,输出 Copy Constructor called
    
    • 不允许有形如 X::X( X )的构造函数。
      例3
    class CSample {
    	CSample(CSample c) {
    	} //错,不允许这样的构造函数
    };
    
    

    复制构造函数起作用的三种情况

    • 当用一个对象去初始化同类的另一个对象时。
    Complex c2(c1);
    Complex c2 = c1; //初始化语句,非赋值语句
    
    • 如果某函数有一个参数是类A的对象,那么该函数被调用时,类A的复制构造函数将被调用。
    class A
    {
    public:
    	A() { };
    	A(A & a) {
    		cout << "Copy constructor called" << endl;
    	}
    };
    void Func(A a1) { }
    int main() {
    	A a2;
    	Func(a2);
    	return 0;
    }
    

    输出结果: Copy constructor called

    • 如果函数的返回值是类A的对象时,则函数返回时,A的复制构造函数被调用:
    class A
    {
    public:
    	int v;
    	A(int n) { v = n; };
    	A(const A & a) {
    		v = a.v;
    		cout << "Copy constructor called" << endl;
    	}
    };
    
    A Func() {
    	A b(4);
    	return b;
    }
    int main() {
    	cout << Func().v << endl;
    	return 0;
    }
    

    输出结果:
    Copy constructor called
    4

  • 相关阅读:
    docker save docker load
    Vue 开发线路 资料 汇总
    electron 开发拆坑总结
    mysqldbcopy 数据库复制工具
    用rsync命令删除大文件夹
    linux nc,nmap,telnet ,natstat命令
    搭建云版容器版本 需要的基础软件 安装工具
    phantomjs 前端测试工具
    消息列队 php 基于redis 实现
    部分安卓机器【小米手机】,文字显示不全
  • 原文地址:https://www.cnblogs.com/rookieveteran/p/13995284.html
Copyright © 2020-2023  润新知