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

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

最新文章

  1. Query Designer:Hierarchy层级显示
  2. 《与小卡特一起学Python》Code1
  3. 读文章《Flexbox详解》笔记
  4. html中给表格添加斜线
  5. 从零开始写一个武侠冒险游戏-8-用GPU提升性能(3)
  6. .net 的生成操作
  7. Linux开机执行顺序
  8. Cocos2d-JS中JavaScript继承
  9. What is the difference between Views and Materialized Views in Oracle?
  10. Python内存解析浅学
  11. ZooKeeper(3.4.5) - 配置伪集群模式
  12. as。 对象和数组
  13. 【JAVA - 基础】之数据加密和解密
  14. VS2008 error C2470
  15. DIP And DI
  16. 从一道例题谈Arrays.toString()与其他String的转换方法
  17. DOM遍历-祖先
  18. Word转PDF(SaveAsPDFandXPS + jacob)
  19. python之常用模块
  20. 在docker中使用mysql数据库,在局域网访问

热门文章

  1. Android配置OpenCV C++开发环境
  2. An iOS zero-click radio proximity exploit odyssey
  3. 记一次Linux光盘救援
  4. bean的作用域解析
  5. bat脚本关闭、等待时间、启动程序、
  6. ProxySQL 防火墙白名单
  7. Elastic:应用程序性能监控/管理(APM)实践
  8. 在kibana中查看nginx日志的Discover,Dashboards
  9. Security Context
  10. 15. Fluentd输入插件:in_tail用法详解