C++拾遗--构造函数(二)
在构造函数(一)中讨论的是默认构造函数的一些应用。这里我们来探讨下其它的一些有名构造函数,及其它们的应用场景。
#include <iostream> using namespace std; class Complex { protected: int real = 0; int imag = 0; public: //默认构造 Complex() { cout << "Complex()" << endl; } Complex(int r, int i) :real(r), imag(i) { cout << "Complex(int r, int i)" << endl; } //指定其它的构造函数完成自己的工作,相当于委托 Complex(int r) :Complex(r, 0) { cout << "Complex(int r)" << endl; } Complex(Complex& com) //拷贝构造的参数必须是引用类型 { cout << "Complex(Complex& com)" << endl; real = com.real; imag = com.imag; } Complex& operator=(Complex& com) //这里的参数可以是非引用的 { cout << "Complex& operator=(Complex& com)" << endl; real = com.real; imag = com.imag; return *this; } }; int main() { Complex com1; //默认初始化,调用Complex()默认构造 cout << "---" << endl; Complex com2(com1); //直接初始化,调用Complex(Complex& com) cout << "---" << endl; Complex com3 = com1; //赋值初始化,调用Complex(Complex& com) cout << "---" << endl; Complex com4; //默认初始化,调用Complex()默认构造 cout << "---" << endl; com4 = com1; //赋值,调用operator=(Complex& com) cout << "---" << endl; Complex com5(1, 1); //调用指定的构造函数Complex(int r, int i) cout << "---" << endl; Complex com6(1); cin.get(); return 0; }运行
类似于Complex(Complex& com);其中的参数必须是引用类型,这就是拷贝构造函数。
所谓的浅拷贝和深拷贝,针对的是指针成员,对于普通成员,则无区别。对于指针成员而言,仅仅复制一份地址,则是浅拷贝,若复制的是内容,则是深拷贝。
若复制的仅仅是一份地址,则多个对象会共用同一份资源,当其中一个对象被销毁,资源随之销毁。其它对象则受影响。这就是所谓的浅拷贝和深拷贝的问题。
在新标准中把类似于 Complex(int r):Complex(r, 0){}的构造称为委托构造。
类比于设计模式:委托,可以很好理解。Complex(int r)把实际工作交给了Complex(r, 0)。
所有内容目录
原文地址:http://blog.csdn.net/zhangxiangdavaid/article/details/43764175