龙空技术网

那些让人欲罢不能的复制构造函数

带刺儿的黄瓜123 38

前言:

此刻同学们对“带两个参数的构造函数”大致比较着重,我们都想要分析一些“带两个参数的构造函数”的相关文章。那么小编也在网上网罗了一些对于“带两个参数的构造函数””的相关文章,希望小伙伴们能喜欢,大家快快来学习一下吧!

缺省构造函数:

即为系统提供的,参数表为空的构造函数。

带默认参数的构造函数:

当我们需要构造函数中的某些参数值不被改变时,可以将其定义为带默认参数的构造函数。

class Test{

int x,y;

public:

Test(int i=0,int j=0):x(i),y(j){}

……

};

Test类的工作函数即为带有默认参数的工作函数,在这里定义数据成员i,j时就已经将它们赋值为零。这就是带有默认参数的构造函数。

重载构造函数:

构造函数是可以进行重载的,一个类中可以定义多个构造函数,(一个类只能有一个缺省构造函数)但是这些构造函数同样也必须满足函数重载的条件——即所带参数的个数或类型不同,以便定义对象调用构造函数时不能严格匹配产生二义性。

当有多个构造函数时,系统通过形参表来匹配构造函数。

如:11 / 30

Test a(1,2);与Test b;这两条语句,很明显,在定义对象时调用的构造函数是不一样的,第一条语句应该调用有两个参数的构造函数,而第二条语句则应该调用缺省构造函数。

如上Test b;在调用缺省构造函数时要注意区分Test b;和Test b();

前者是创建Test类的对象a;而后者是声明函数a,此函数函数的返回值是Test类型,也就是把Test当作数据类型作为返回值,同样可以类比C语言中数据结构。

复制构造函数:

复制构造函数是一种特殊的构造函数,其作用是用一个已经存在的对象去初始化一个新的同类的对象,简单来说,就是

用已知对象创建同类对象

复制构造函数的一般形式:

类名::类名(const 类名 &引用对象名){

函数体

}

复制构造函数的特点:

* 只有一个形参,并且该参数是该类的对象的引用,即形式中的引用对象名。

* 每一个类中都必须有一个复制构造函数。如果用户没有声明类的复制构造函数,系统会自动生成一个缺省复制构造函数。

复制构造函数的功能:

把引用对象的每个数据成员的值对应赋给新建立的对象的数据成员。

复制构造函数是如何被调用的呢?

根据一般形式,先定义一个对象a,再定义一个对象b,用缺省复制构造函数将a的数据值传递复制给b。

Test a (1,2);

Test b(a);

显然Test b(a)这条语句调用了缺省复制构造函数,将对象a的数据都复制传递给了b。

其实这条语句调用的是系统提供的缺省复制构造函数,必要时,我们也可以自定义复制构造函数。

定义形式如下:

类名::类名(const 类名 &引用对象名){

函数体

};

自定义复制构造函数与缺省复制构造函数的调用语句并无区别。

什么时候需要调用复制构造函数呢?

* 当用已有对象去初始化该类的另一个新对象时。

Test a (1,2);

Test b(a);

* 如果函数的形参,是类的对象,调用函数进行形参和实参的结合。

Test a;

fun(a);

调用函数fun()时实参是Test类的对象,故调用函数时将复制一个新对象obj。

* 如果函数的返回值是类的对象,函数调用完成时。

Test a;

a=fun();

这种情况下,在fun返回对象时,也会调用复制构造函数,复制出临时对象,然后将临时对象的值赋给a。

我们为什么要用到复制构造函数呢?

用第一个例子做对比:

调用了复制函数的语句:

Test a (1,2);

Test b(a);

直接用对象复制和复制的语句

Test a,b;

b=a;

我们可以清楚的看到,不调用复制构造函数的语句明显语句更多,更不清晰,而且程序运行过程中需要执行赋值运算符重载函数。

类型转换构造函数:

除复制构造函数外,只有一个参数的构造函数一般都可以称作类型转换构造函数,起到类型自动转换的作用。

如Test(int i);这个构造函数就可以称为Test类的类型转换构造函数。

定义对象之后就可以调用Test (int i )函数,来完成对象的初始化。

标签: #带两个参数的构造函数