示例代码1
点击查看代码
class CDate{
public:
CDate(int _year,int _month, int _day){
this->year=_year;
this->month=_month;
this->day=_day;
}
private:
int year;
int month;
int day;
};
class Student2{
public:
Student2(const char * _name , int _id, int _year,int _month ,int _day) {
this.ID=_id;
strcpy(name,_name);
}
private:
char name[20];
int ID;
CDate age;
};
int main(){
Student2 s("zhangsan",1001,2022,1,1);
return 1;
}
上面代码编译报错,student类对象在初始化的时候,需要初始化成员CDate,但是由于CDate有自定义的构造函数,系统 找不到无参构造函数,所以报错. 改造代码后如下
示例代码2
点击查看代码
class CDate{
public:
CDate(int _year,int _month, int _day){
this->year=_year;
this->month=_month;
this->day=_day;
}
private:
int year;
int month;
int day;
};
class Student2{
public:
Student2(const char * _name , int _id, int _year,int _month ,int _day) : ID(_id), age(_year,_month,_day){
strcpy(name,_name);
}
private:
char name[20];
int ID;
CDate age;
};
int main(){
MyString s1("abcd");
s1.printChar();
MyString s2=s1;//执行拷贝构造
s2.printChar();
MyString s3("1234");
s3=s1;//执行赋值函数
s3.printChar();
return 1;
}
: ID(_id), age(_year,_month,_day)
构造函数中 冒号右边的 叫做 构造函数初始化列表
Student2(const char * _name , int _id, int _year,int _month ,int _day) : ID(_id), age(_year,_month,_day){ strcpy(name,_name); }
Student2(const char * _name , int _id, int _year,int _month ,int _day) : age(_year,_month,_day){ this.ID=_id strcpy(name,_name);
}
上面两种方式有什么区别?
: ID(_id), age(_year,_month,_day)
构造函数初始化列表 中 ID(_id) 相当于 int ID=_id; 定义同时初始化
Student2(const char * _name , int _id, int _year,int _month ,int _day) { this.ID=_id // 这种方式相当于 int ID; ID=_id; 先定义,然后再初始化. strcpy(name,_name); }
针对简单内置的基础数据类型这两种方式汇编指令区别不大,但是如果是CDate类类型,如果像下面这样 Student2(const char * _name , int _id, int _year,int _month ,int _day) : ID(_id) , age(_year,_month,_day) { strcpy(name,_name); }
编译器其实会这样做 1:CDate age=Date(_year,_month,_day);//定义age对象同时做初始化,并直接指定了构造方式
如果是下面方式 Student2(const char * _name , int _id, int _year,int _month ,int _day) { this->ID=_id; this->age=CDate(_year,_month,_day); strcpy(name,_name); } 编译器其实会这样做 1:先创建一个 CDate 对象 age CDate age();//使用无参构造函数 2:age=CDate(_year,_month,_day); 上面在第一步的时候,系统调用无参构造函数的时候就报错了,因为没有无参的构造函数.
标签:
留言评论