数据成员名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<<"."<<day<<endl; } void main() { Date date1; // 声明类Date的对象date1, // 调用无参数的构造函数 cout<<"Date1 output: "<<endl; date1.showDate(); // 调用date1的showDate(),显示date1的数据 Date date2(2002, 11, 14); // 定义类Date的对象date2, // 调用带参数的构造函数 cout<<"Date2 output: "<<endl; date2.showDate(); // 调用date2的showDate(),显示date2的数据 }