首页IT科技构造函数进行初始化(构造函数初始化列表)

构造函数进行初始化(构造函数初始化列表)

时间2025-05-20 16:22:09分类IT科技浏览3777
导读:示例代码1 点击查看代码 class...

示例代码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);

上面在第一步的时候,系统调用无参构造函数的时候就报错了,因为没有无参的构造函数.

创心域SEO版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!

展开全文READ MORE
网站优化seo教程怎么做(网站优化seo教程图片) vue前端面试题2021(vue3面试题:2022 最新前端 Vue 3.0 面试题及答案(持续更新中……))