构造函数(二)拷贝构造

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;}运行

有名构造函数1.拷贝构造

类似于Complex(Complex& com, arg_list);其中的第一个参数必须是该类类型的引用类型,arg_list是可选的,若存在,则必须具有默认实参,这就是拷贝构造函数。

所谓的浅拷贝和深拷贝,针对的是指针成员,对于普通成员,则无区别。对于指针成员而言,仅仅复制一份地址,则是浅拷贝,若复制的是内容,则是深拷贝。

若复制的仅仅是一份地址,则多个对象会共用同一份资源,当其中一个对象被销毁,资源随之销毁。其它对象则受影响。这就是所谓的浅拷贝和深拷贝的问题。

2.委托构造

在新标准中把类似于 Complex(int r):Complex(r, 0){}的构造称为委托构造。

类比于设计模式:委托,可以很好理解。Complex(int r)把实际工作交给了Complex(r, 0)。

所有内容目录

CCPP Blog 目录

天不负;卧薪尝胆,三千越甲可吞吴。

构造函数(二)拷贝构造

相关文章:

你感兴趣的文章:

标签云: