1.构造函数名字必须与类名同名,不具有类型,不返回任何值,不需要用户调用,一般声明为public, 构造函数可以类内定义也可以类外定义。
2.不带参数的构造函数
class Box
{
public:
Box();
int volume();
private:
int height;
int width;
int length;
};
Box::Box() //不带参数的构造函数
{
height = 10;
width = 10;
length = 10;
}
3.用参数初始化表对数据成员初始化
class Student
{
public:
Student(int n,char s,char nam[]):num(n),sex(s){strcpy(name,nam)};
int volume();
private:
int num;
int sex;
int name[20];
};
可以这样定义对象stud1:
Student stud1(10101,'m',"Wang_li");
4.构造函数的重载
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;
}
在定义对象时:
Box box1; //调用第一个构造函数
Box box2(15,30,25); //调用第二个构造函数
5.可以不用参数而调用的构造函数,一个类只能有一个,这样做是为了避免调用时的歧义性。
比如:
Box();
Box(int = 10,int = 10.int = 10);
在建立对象时,如果写成
Box box1;
那么编译系统将无法识别应该调用哪个,出现歧义。
6.在一个类中定义了全部是默认参数的构造函数后,不能再定义重载构造函数;如果构造函数中的参数并非全部为默认值时,就要分析具体情况。
全部为默认参数:
Box(int =10.int = 10, int = 10); //全部为默认参数
Box(); //无参的构造函数
Box(int,int); //有两个参数的构造函数
若有以下定义语句:
Box box1; //歧义,不知道调用1还是2.
Box box2(15,30); //歧义,不知道调用1还是3
部分为默认参数:
Box(); //无参的构造函数
Box(int,int = 10,int = 10); //有一个参数的构造函数
Box(int,int); //有两个参数的构造函数
若有以下定义语句:
Box box1; //正确
Box box2(15); //调用第二个构造函数
Box box3(15,30); //错误,出现歧义。
7.对象数组的构造函数
假设有一个类Student,建立一个对象数组(即数组中的每个元素均是一个对象),然后使用构造函数对其进行初始化。
- 如果构造函数只有一个参数,在定义数组时可以直接在等号后面的花括号内提供实参。
Student stud[3] = {60,70,80};
//合法,3个实参分别传递给3个数组元素的构造函数。
- 但是,如果构造函数有三个参数呢 ?那上面的代码到底是为每个对象各提供第一个实参,还是全部都作为第一个对象的3个实参呢?
实际上,编译系统是这样处理的:这3个实参分别作为3个元素的第一个实参。
针对有多个参数的构造函数,在进行对象数组的初始化时,正确的做法是:
在花括号中写出构造函数名并在括号内指定实参。
Student stud[3] = {
Student(1001,18,87),
Student(1002,19,76),
Student(1003,18,72)
};