类中构造函数的作用是对对象初始化,它是一种特殊的成员函数,不需要用户来调用它,而是在建立对象时自动执行。构造函数的名字必须与类名相同,它不具有任何类型,不返回任何值。构造函数的功能由用户定义,用户根据初始化的要求设计函数体和函数参数。若用户未定义构造函数,则系统会默认生成一个构造函数,但它的函数体是空的,不起有任何作用。
构造函数可以重载。常用的构造函数有如下几种:
1.默认构造函数:也称缺省构造函数,调用构造函数时不必给出实参,一个类只能有一个默认构造函数。一般格式为构造函数名(),若在建立对象时选用的是默认构造函数,应注意正确书写定义对象的语句 ,如Complex c;不能写成Complex c( );
2.有参数的构造函数:调用不同对象的构造函数时,从外面将不同的数据传递给构造函数以实现不同的初始化,一般格式为构造函数名(类型1 形参1,类型2 形参2,。。。)
3.有默认参数的构造函数:构造函数中参数的值既可以通过实参传递,也可以指定为某些默认值,如果用户不指定实参值,编译系统就使形参取默认值。其作用相当于好几个重载的构造函数。应该在声明构造函数时指定默认值,而不能只在定义构造函数时指定默认值,如果构造函数的全部参数都指定了默认值,则在定义对象时可以给出一个或几个实参,也可以不给出实参,由于不需要实参也可以调用构造函数,故全部参数都指定了默认值的构造函数属于默认构造函数,由于一个类中只能有一个默认构造函数,为避免歧义性,不能同时定义下面两个构造函数: Complex(); Complex(double=0,double=0);在一个类中定义了全部是默认参数的构造函数后,不能再定义重载构造函数。
4.复制构造函数:复制构造函数只有一个参数,这个参数是本类的对象(不能是其他类的对象),而且采用对象的引用形式(一般加const声明,使参数值不能改变),此复制构造函数的作用是将实参对象的各数据成员值一一赋给新对象对应的数据成员。
对象的复制一般形式为 :类名 对象2(对象1);其作用是用已有的对象1去克隆出一个新对象2。Complex c2(c1),这是复制对象的语句,也是建立对象的语句,建立一个新对象c2,由于在括号内给定的实参是对象,因此编译系统调用复制构造函数,将c1对象中各数据成员的值赋给c2中各数据成员。复制对象还有一种形式:类名 对象名2=对象名1,其作用也是调用复制构造函数。
5.转换构造函数:转换构造函数的作用是将一个其他类型的数据转换成一个类的对象。其形参只有一个,如Complex(double r){real=r;image=0;},其作用是将double型的参数r转换成Complex类的对象,将r作为复数的实部,虚部为0.
若以上几个构造函数同时出现在类体中,编译系统会根据建立对象时给出的实参个数与类型来选择与之匹配的构造函数。
//构造函数实例,该类表示一个复数
class Complex
{
public:
Complex(); //默认构造函数
Complex(double,double); //带参数的构造函数
Complex(double=5.0,double=5.0); //使用默认参数的构造函数
Complex(Complex&c); //复制构造函数
Complex(double); //转换构造函数
private:
double real;
double image;
}
Complex::Complex()
{
real =0.0;
image=0.0;
}
Complex::Complex(double i,double j)
{
real =i;
image=j;
}
Complex::Complex(Complex&c)
{
real =c.real;
image=c.image;
}
Complex(double r)
{
real =r;
image=0.0;
}