;< endl;
return 0;
}
2. 成员初始化表
对于常量类型和引用类型的数据成员,不能在构造函数中用赋值语句直接赋值,C++提供初始化表进行置初值。
带有成员初始化表的构造函数的一般形式如下:
类名::构造函数名([参数表])[:(成员初始化表)]
{
// 构造函数体
}
成员初始化表的一般形式为:
数据成员名1(初始值1),数据成员名2(初始值2),……
例2.9 成员初始化表的使用
#include<iostream.h>
class A{
public:
A(int x1):x(x1),rx(x),pi(3.14) // rx(x)相当于rx=x, pi(3.14)相当于pi=3.14
{ }
void print()
{cout<<"x="<<x<<" "<<"rx="<<rx<<" "<<"pi="<<pi;}
private:
int x; int& rx; const float pi;
};
main()
{
A a(10);
a.print();
return 0;
}
- 构造函数采用成员初始化表对数据成员进行初始化,是一些程序员喜欢使用的方法。
class B{
int i;
char j;
float f;
public:
B(int I, char J, float F)
{ i=I; j=J; f=F; };
};
class B{
public:
B(int I,char J,float F):i(I),j(J),f(F)
{ }
private:
int i;
char j;
float f;
};
说明
如果需要将数据成员存放在堆中或数组中,则应在构造函数中使用赋值语句,即使构造函数有成员初始化表也应如此。
class C{
public:
C(int I,char Ch,float F,char N[]):i(I),ch(Ch),f(F)
{ strcpy (name,N);}
private:
int i;
char ch;
float f;
char name[25];
};
- 类成员是按照它们在类里被声明的顺序初始化的,与它们在初始化表中列出的顺序无关。
【例2.10】
#include<iostream.h>
class D {
public:
D(int i):mem2(i),mem1(mem2+1)
{
cout<<"mem1: "<<mem1<<endl;
cout<<"mem2: "<<mem2<<endl;
}
private:
int mem1;
int mem2;
};
void main()
{
D d(15);
}
mem1: -858993459
mem2: 15
3. 缺省参数的构造函数
例2.11
#include<iostream.h>
class Coord {
public:
Coord(int a=0,int b=0){ x=a; y=b;} // 带有缺省参数的构造函数
int getx(){ return x; }
int gety(){ return y; }
private:
int x,y;
};
void main()
{
Coord op1(5,6); Coord op2(5); Coord op3;
int i,j;
i=op1.getx();j=op1.gety();
cout<<"op1 i= "<<i<<" op1 j= "<<j<<endl;
i=op2.getx();j=op2.gety();
cout<<"op2 i= "<<i<<" op2 j= "<<j<<endl;
i=op3.getx();j=op3.gety();
cout<<"op3 i= "<<i<<" op3 j= "<<j<<endl;
}
class Box{
public:
Box(int h=10,int w=10,int l=10); //在声明构造函数时指定默认参数
int volume( ){ return(height*width*length); }
private:
int height;
int width;
int length;
};
Box:: Box(int h,int w,int l) //在定义函数时可以不指定默认参数
{
height=h;
width=w;
length=l;
}
4. 重载构造函数
构造函数的重载
在一个类中可以定义多个构造函数,以便对类对象提供不同的初始化的方法,供用户选用。这些构造函数具有相同的名字,而参数的个数或参数的类
型不相同(这称为构造函数的重载)
关于构造函数重载的说明
- (1) 默认构造函数:一个调用构造函数时不必给出实参的构造函数。 显然,无参的构造函数属于默认构造函数。一个类只能有一个默认构造函数。
- (2) 尽管在一个类中可以包含多个构造函数,但是对于每一个对象来说,建立对象时只执行其中一个构造函数,并非每个构造函数都被执行。
class Box{
public:
Box(int h, int w, int l): height(h),width(w),length(l) { }
Box();
int volume( );
private:
int height;
int width;
int length;
};
Box::Box()
{
height = 10;
width = 10;
lenght = 10;
}
int Box::volume( )
{
return height*width*length;
}
int main( )
{
Box box1; // 书上为 box1();
cout << box1.volume( ) << endl;
Box box2(15,30,25);
cout << box2.volume( ) << endl;
return 0;
}
例2.17 重载构造函数应用例程。
#include <iostream.h>
class Date{
public:
Date(); // 无参数的构造函数
Date(int y,int m,int d); // 带有参数的构造函数
void showDate();
private:
int year, month, day;
};
Date::Date()
{ year=1998; month=4; day=28; }
Date::Date( int y, int m, int d)
{ year=y; month=m; day=d; }
inline void Date::showDate()
{ cout<<year<<"."<<month<<".&q