【C++】类与对象全面剖析(尾卷)(构造深化、类型转换、static成员特性及内部类与匿名对象)

【C++】类与对象全面剖析(尾卷)(构造深化、类型转换、static成员特性及内部类与匿名对象)
在这里插入图片描述


文章目录

一、再探构造函数

在之前的文章中我们大致将构造函数讲完了,但是还有一个比较重要的知识点当时没有讲到,因为如果把这部分内容加上去,会让前面的内容难度变得非常高,所以这部分内容放到这里来讲,之前讲构造函数的文章是:【C++】揭秘类与对象的内在机制(核心卷之构造函数与析构函数的奥秘)
接下来进入今天的正题,我们今天要补充的内容就是构造函数中的“初始化列表”,它可以帮我们对成员变量进行初始化,我们还是先来看看它的语法格式(刚开始学可能看起来怪怪的,熟悉了就好了),如下:
classDate{ public://不使用初始化列表Date(int year =2025,int month =1,int day =1){  _year = year; _month = month; _day = day;}//使用初始化列表Date(int year =2025,int month =1,int day =1):_year(year)//在花括号(函数体)前以冒号为开始,_month(month)//从第二行开始用英文逗号分隔,_day(day){ }//在花括号中(函数体中)可以正常执行其它代码,这里就不演示了private:int _year;int _month;int _day;};
在上面的代码中,有两个构造函数,一个不使用初始化列表和一个使用了初始化列表,在这里它们的作用都是一样的,就是根据用户传来的年月日对当前对象进行初始化
那么既然上面的代码中,无论是否使用了初始化列表,两个构造函数的作用都相同,而且这个初始化列表还这么丑,它到底有什么不同之处呢?接下来我们就正式介绍初始化列表
初始化列表非常重要,有3类成员变量必须使用初始化列表进行初始化,如果不使用初始化列表就会报错,它们分别是cosnt成员变量、引用成员变量以及自定义类型成员变量,那么为什么这3类成员变量就必须使用初始化列表进行初始化呢?
其中cosnt成员变量以及引用成员变量比较特殊,它们都只能初始化一次,如果我们将其写在构造函数内部进行初始化会有一定的歧义,比如const成员变量只能初始化一次,往后这个成员变量的值就不能修改了,如果它在函数体出现两次,该选择哪个值作为它的结果
而引用对象也是,只能初始化一次,往后只能修改引用对象的值,而不能修改引用对象的指向,如果在构造函数函数体中出现了两次,最终该选择哪个变量作为它的引用对象呢?我们来看如下伪代码:
classA{ public://构造A(int& a,int& b){ //如果写在函数体内,编译器最终应该选择a还是选择4这个值 _a = a; _a =4;//_b又应该是谁的引用?会产生歧义 _b = b; _b = a;}private:constint _a;int& _b;};
所以针对这两类比较特殊的成员变量,C++就设计了初始化列表,供这种只能初始化一次的成员变量进行初始化,如果使用上面的方式进行初始化编译器就会直接报错,所以初始化列表确保了初始化的唯一性,如下:
classA{ public:A(int& a,int& b):_a(a),_b(b){ }private:constint _a;int& _b;};
这就是为什么const成员变量和引用成员变量必须使用初始化列表进行初始化的原因,那么为什么自定义类型也要使用初始化列表进行初始化呢?其实跟上面两个的原因差不多,我们慢慢来分析,首先在有默认构造的情况下,编译器会自动调用这个自定义类型的默认构造,如下:
classB{ public:B(int b =10){  _b = b;}private: Date _d;int _b;};intmain(){  B b;return0;}
在这个例子中,类B中既有内置类型,又有自定义类型,B中只对内置类型作了处理,编译器也不会报错,因为编译器默认会去调用这个自定义类型的默认构造对这个自定义类型的成员变量作初始化,我们调试来看看:

Read more

【C++】C++11 新特性揭秘:序章

【C++】C++11 新特性揭秘:序章

C++语法相关知识点可以通过点击以下链接进行学习一起加油!命名空间缺省参数与函数重载C++相关特性类和对象-上篇类和对象-中篇类和对象-下篇日期类C/C++内存管理模板初阶String使用String模拟实现Vector使用及其模拟实现List使用及其模拟实现容器适配器Stack与QueuePriority Queue与仿函数模板进阶-模板特化面向对象三大特性-继承机制面向对象三大特性-多态机制STL 树形结构容器二叉搜索树AVL树红黑树红黑树封装map/set哈希-开篇闭散列-模拟实现哈希哈希桶-模拟实现哈希哈希表封装 unordered_map 和 unordered_set 大家好,我是店小二。今天,我们将深入探讨 C++11 中新增的特性。在之前的学习过程中,大家或许已经接触或掌握了一些相关特性。让我们继续前进,探索更多 C++11 的精彩内容吧! 🌈个人主页:是店小二呀 🌈C语言专栏:C语言 🌈C++专栏: C++ 🌈初阶数据结构专栏: 初阶数据结构 🌈高阶数据结构专栏: 高阶数据结构 🌈Linux专栏: Linux 🌈喜欢的诗句:无人

By Ne0inhk
深入解析C++驱动开发实战:优化高效稳定的驱动应用

深入解析C++驱动开发实战:优化高效稳定的驱动应用

深入解析C++驱动开发实战:优化高效稳定的驱动应用 在现代计算机系统中,驱动程序(Driver)扮演着至关重要的角色,作为操作系统与硬件设备之间的桥梁,驱动程序负责管理和控制硬件资源,确保系统的稳定与高效运行。随着设备复杂度的增加和系统性能需求的提升,如何使用C++高效、稳定地开发驱动程序,成为开发者亟需解决的关键问题。本文将深入探讨C++驱动开发中的常见问题及其优化策略,通过详细的示例代码,帮助开发者构建高性能、稳定可靠的驱动应用。 🧑 博主简介:ZEEKLOG博客专家、ZEEKLOG平台优质创作者,高级开发工程师,数学专业,10年以上C/C++, C#, Java等多种编程语言开发经验,拥有高级工程师证书;擅长C/C++、C#等开发语言,熟悉Java常用开发技术,能熟练应用常用数据库SQL server,Oracle,mysql,postgresql等进行开发应用,熟悉DICOM医学影像及DICOM协议,业余时间自学JavaScript,Vue,qt,python等,具备多种混合语言开发能力。撰写博客分享知识,致力于帮助编程爱好者共同进步。欢迎关注、交流及合作,

By Ne0inhk