示例代碼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);
上面在第一步的時候,系統呼叫無參建構式的時候就報錯了,因為沒有無參的建構式.
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/532504.html
標籤:C++
上一篇:<三>物件的淺拷貝和深拷貝問題
下一篇:<五>關于類的各類成員
