构造函数体内的赋值:

创建一个类对象时,编译器通过调用构造函数,给对象中的成员变量一个初值

class Date
{
public://构造函数体内赋值Date(int year,int month,int day){_year = year;_month = month;_day = day;}
private:int _year;int _month;int _day;
};

虽然上述构造函数调用之后,对象中已经有了一个初始值,但是不能将其称作类对象成员的初始化,构造函数体中操作只能将其称作为赋初值,而不能将其称作为初始化。因为初始化只能初始化一次,而构造函数体内,可以给 成员多次赋值

初始化列表:
以一个冒号开始,接着是一个以逗号分割的数据成员列表每个"成员变量"后面跟一个放在括号中的初始值或表达式

class Date
{
public://用初始化列表初始化对象成员变量Date(int year,int month,int day):_year(year),_month(month),_day(day){}
private:int _year;int _month;int _day;
};

说明:

  1. 每个成员在初始化列表中只能出现一次
  2. 初始化列表仅用于初始化类的数据成员,并不指定这些数据成员的初始化顺序,数据成员在类中定义顺序就是在初始化列表中的初始化顺序
  3. 尽量避免使用成员初始化成员,成员的初始化顺序最好和成员的定义顺序保持一致
  4. 类中包含以下成员,必须放在初始花列表中对其初始化:
  • 引用成员标量
  • const 修饰的成员变量
  • 类类型成员

构造函数作用:

构造函数不仅可以把对象构造成功,还可以给对象中各个成员变量一个初始值,有时候还具有类型转换的作用(这点以后解释)

默认构造函数: 

如果一个类未显式定义构造函数时,编译器会合成一个默认的构造函数。如果类显式定义了,编译器将不再合成。
注意:编译器合成的构造函数一定是不带参数的

class Date
{
public:void show(){cout << _year << "-" << _month << "-" << _day << endl;}
private:int _year;int _month;int _day;
};void test()
{Date d;d.show();  //随机值
}

以上代码中我们没有显示定义构造函数,对象可以创建成功,因为编译器合成了一个默认的不带参数的默认构造函数,但是该默认构造函数实际什么事情都不做,类似以下方式:

Date()
{}

即该构造函数实际没有任何意义。那完全可以不用合成,合成了就要调用,而调用了该构造函数又没有实际意义, 而且还影响程序的效率

通过汇编代码发现,创建对象语句底层没有构造函数对应的汇编语句,即编译器并未合成构造函数(可以显式添加无参构造函数,就会看到调用构造函数的汇编代码)

因此编译器对是否合成构造函数进行了优化,编译器根据自己的需求选择性的合成构造函数,即如果类中没有显式定义构造函数,在编译器需要且有能力合成时,会合成一个无参的构造函数。比如

class Time
{
public:Time(int hour = 12,int minute = 12,int second = 12):_hour(hour),_minute(minute),_second(second){}
private:int _hour;int _minute;int _second;
};class Date
{
public:void show(){cout << _year << "-" << _month << "-" << _day<< endl;}
private:int _year;int _month;int _day;Time _t;
};void test()
{Date d;d.show();
}

Time类显式定义了其缺省的构造函数,Date类未显式定义构造函数,其中包含了一个Time类对象。当创建Date类对象时,编译器需要调用Date类的构造函数完成Date类对象的构造,由于Date未显式定义,此时编译器必须合成:因为Time类的构造函数存在,合成Date构造函数的目的就是为了完成Data类对象中包含的Time类对象的构造

但是,如果将Time类缺省的构造函数改成非缺省构造函数编译器就没有能力合成,此时会报错

这里很好的说明了编译器 有必要且有能力 合成构造函数

C++语言—深入理解构造函数相关推荐

  1. c语言如何编程硬件,硬件C语言教程开篇——我对c语言的理解

    对于没有编程经历的人来说,初次听说 C语言 这个概念是一种很奇怪的感觉,C语言是什么,是一种外星语言么?为什么叫C语言呢?它是哪国说的话呢? 那"语言"是个什么概念呢?百度百科上解 ...

  2. JavaScript面向对象——理解构造函数继承(类继承)

    JavaScript面向对象--理解构造函数继承(类继承) 构造函数式继承(类继承) function SuperClass(id) {// 引用类型公有属性this.books = ['JavaSc ...

  3. 论文浅尝 - ACL2022 | 基于多语言语义解耦表示的跨语言迁移方法实现多语言阅读理解...

    论文作者:吴林娟,天津大学,研究方向为自然语言理解 论文链接:http://arxiv.org/abs/2204.00996 代码地址:https://github.com/wulinjuan/SSD ...

  4. java 变量作用域 c语言_C语言深入理解 - 常量与变量

    ++++++++++++++++++++++++++++++++++++++++++ <C语言深入理解系列 - 常量与变量> 查看其它博文请关注原创作者. 本文系本站原创,欢迎转载! 转载 ...

  5. 解释型语言和编译型语言的区别_从泛型的使用情况看出你对语言的理解程度(2)...

    上篇我们提到:Java中的泛型是不可变的,可以通过<? extends E>实现了泛型的协变,<? super E>实现泛型的逆变.从泛型的使用情况看出你对语言的理解程度(1) ...

  6. 图书封面的故事之——“巴别塔”选自《七周七语言:理解多种编程范型》

    我认为,图书的封面很重要,因为首先映入读者眼帘的就是封面,他可以诱发潜在的读者去注意图书,图书的封面可以显示出很多信息,例如书名.推荐语.评价.出版单位等,最重要的还是要给图书起一个好的名字,一本好书 ...

  7. c语言有较强的网络操作功能吗,《对于C语言的理解》--06级网络班 刘丽君

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 对C语言的理解       (刘丽君) 在此之前的半学期里,对于C语言这个概念很模糊.听了老师这堂课总算略见一点端倪. 对于C语言,我的理解正如老师所说的 ...

  8. UC 国际信息流推荐中的多语言内容理解

    导读:本次分享的题目是 UC 国际信息流推荐中的多语言内容理解,讲一下我们在国际信流推荐场景下的多语言内容理解方面的一些工作和思考,主要分为: 多语言内容理解的需求和挑战 多语言内容结构化信号建设方法 ...

  9. java看不起c语言,为什么我感觉Java比C语言难呢?总觉得逻辑上没有C语言好理解。比如各种继承介面。包之间的关系。...

    为什么我感觉Java比C语言难呢?总觉得逻辑上没有C语言好理解.比如各种继承介面.包之间的关系.以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我 ...

最新文章

  1. Chrome与chromedriver版本对应
  2. leetcode Single Number python
  3. 今日头条在消息服务平台和容灾体系建设方面的实践与思考
  4. 在libevent中使用线程池
  5. 转化率高的爆款文案都是如何写出来的?
  6. 重磅!阿里巴巴Blink正式开源,重要优化点解读\n
  7. 浅谈架构之路:前后端分离模式
  8. TypeScript实战:下棋游戏
  9. 一文让你详细了解CPU的内部架构和工作原理(好文)
  10. 用php搭建微信公众号淘客三合一系统
  11. von-ui组件库文档
  12. Springboot测试类之@RunWith注解
  13. CES 2023:华硕轻薄本创新形态+硬核配置引领新创作时代
  14. matlab外推预测函数,时间序列模型 (五): 趋势外推预测方法
  15. 笔记本电脑睡眠或休眠无法唤醒怎么办?
  16. 最小二乘法拟合椭圆(椭圆拟合线)
  17. 各大主流招聘平台的优缺点和适合人群【总结】
  18. GPT分区-----Linux系统
  19. allegro模块布局+交互布局详解
  20. Element UI - v-infinite-scroll无限滚动组件

热门文章

  1. vpython 做圆周运动_《每周一点canvas动画》——圆周运动
  2. pb mysql longblob_关于mysql表中longblob字段的问题
  3. 启程去北京(19年面试经历)
  4. mysql repeatableread_mysql-Innodb事务隔离级别-repeatable read详解(转)
  5. 文案不知道怎么写?为你分享自媒体人必学的几个文案写作技巧
  6. annaconda安装
  7. 微信小程序:常用功能5——在线客服功能的实现
  8. (js)删除数组中某个元素的几种方式
  9. Android高级-网易云音乐屏幕适配
  10. python 小说下载_Python之道