zoukankan      html  css  js  c++  java
  • 类和对象:复制构造函数

    形如 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

  • 相关阅读:
    使用RedisTemplate的操作类访问Redis(转载)
    Redis集群方案(来自网络)
    Scale-up and Scale-out(转载)
    数据结构和算法分析 优先队列
    数据结构和算法分析 排序
    linux下的常用命令
    Java HashMap的工作原理(转载)
    二叉查找树(转载)
    Redis实现之对象(三)
    Redis实现之对象(二)
  • 原文地址:https://www.cnblogs.com/rookieveteran/p/13995284.html
Copyright © 2011-2022 走看看