示例代码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:charname[20];intID;CDate age;};int main(){Student2 s("zhangsan",1001,2022,1,1);return 1;}
示例代码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:charname[20];intID;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=_idstrcpy(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 对象 ageCDate age();//使用无参构造函数2:age=CDate(_year,_month,_day);上面在第一步的时候,系统调用无参构造函数的时候就报错了,因为没有无参的构造函数.
【<四>构造函数初始化列表】
推荐阅读
- <五>关于类的各类成员
- 基础版 【网络】内网穿透方案&FRP内网穿透实战
- 二十四 设计模式学习:Spring 中使用到的设计模式
- <二>掌握构造函数和析构函数
- WebKit策略:<foreignObject>可用于绘制svg中的html标签,但与<use>搭配不生效
- Docker | 专栏文章整理🎉🎉
- Unity之"诡异"的协程
- ModuleNotFoundError: No module named 'XXX'
- MAUI新生-XAML语法基础:语法入门Element&Property&Event&Command
- 传奇中祖玛阁四个门怎么走(祖玛阁108房间详细图)