前言:
此刻同学们对“带两个参数的构造函数”大致比较着重,我们都想要分析一些“带两个参数的构造函数”的相关文章。那么小编也在网上网罗了一些对于“带两个参数的构造函数””的相关文章,希望小伙伴们能喜欢,大家快快来学习一下吧!缺省构造函数:
即为系统提供的,参数表为空的构造函数。
带默认参数的构造函数:
当我们需要构造函数中的某些参数值不被改变时,可以将其定义为带默认参数的构造函数。
如
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 )函数,来完成对象的初始化。
标签: #带两个参数的构造函数