构造函数:
如果一个数据成员未被赋值,则其值不可预知。在系统为之分配内存时,保留了存储单元的原状,就成为了这些数据成员的初始值。
注:类的数据成员是不能在声明类时初始化的。
构造函数是一种特殊的成员函数,与其他函数不同,不需要用户调用,而是在建立对象时自动执行。
构造函数与类名相同。
不具有任何类型,不返回任何值。
构造函数的功能由用户定义,用户根据初始化要求设计函数体和函数参数。
两种方法定义构造方法:
在类中声明且定义:
class Time{
public:
Time(){
hour=0;
minute=0;
sec=0;
}//声明构造函数
void set_time();
void show_time();
private:
int hour;
int minute;
int sec;
};
在类中声明但在类外定义:
class Time{
public:
Time();//声明构造函数
void set_time();
void show_time();
private:
int hour;
int minute;
int sec;
};
Time::Time(){
hour=0;
minute=0;
sec=0;
}
说明:
(1)在类对象进入其作用域时调用构造函数。
(2)构造函数无返回值,所以不需要在定义时声明类型。
(3)不需用户调用,也不能被用户调用。
(4)在构造函数体内不仅可以对数据成员赋初值,还可以包含其他语句,但是不提倡加入除了初始化之外的语句。以保持程序清晰。
(5)若用户未自定义构造函数,则C++会自动生成一个构造函数,只是该函数体为空,也无参数,不执行初始化操作。
用参数初始化表对数据成员初始化:
该方法不在函数体内对数据成员初始化,而是在函数首部实现。
例:
Box::Box(int h,int w,int len):height(h),width(w),length(len){}
构造函数的重载
#include<iostream>
using namespace std;
class Box{
public:Box();//声明无参的构造函数
Box(int h,int w,int len):height(h),width(w),length(len){}//声明有参的构造函数,并初始化
int volume();
private:
int height;
int width;
int length;
};
Box::Box(){//定义无参的构造函数
height=10;
width=10;
length=10;
}
int Box::volume(){
return (height*width*length);
}
int main(){
Box box1;//建立无实参对象
cout<<"The volume of the box1 is"<<box1.volume()<<endl;
Box box2(15,20,25);
cout<<"The volume of the box2 is"<<box2.volume()<<endl;
}
注:一个类只能有一个默认构造函数。尽管一个类中可以包含多个构造函数,但是建立对象时只执行其中一个构造函数,并非执行每个构造函数。
#include<iostream>
using namespace std;
class Box{
public:
Box(int h=10,int w=20,int len=30);//声明无参的构造函数指定默认参数
int volume();
private:
int height;
int width;
int length;
};
Box::Box(int h,int w,int len){//定义无参的构造函数时可以不指定默认参数
height=h;
width=w;
length=len;
}
int Box::volume(){
return (height*width*length);
}
int main(){
Box box1;
cout<<"The volume of the box1 is"<<box1.volume()<<endl;
Box box2(15,20,25);
cout<<"The volume of the box2 is"<<box2.volume()<<endl;
Box box3(35);
cout<<"The volume of the box3 is"<<box3.volume()<<endl;
Box box4(40,50);
cout<<"The volume of the box4 is"<<box4.volume()<<endl;
}
在构造函数中使用默认参数是方便而有效的,它提供了建立对象时的多种选择,它的作用相当于好几个重载的构造函数,它的好处是:即使在调用构造函数时没有提供实参值,不仅不会出错,而且还确保按照默认的参数值对对象进行初始化。