当前位置: 首页 > news >正文

类和对象的深入了解6

1.初始化列表

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

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. 类中包含以下成员,必须放在初始化列表位置进行初始化(其余的可以放入,也可以放入构造函数内):

1. 引用成员变量

2.const成员变量

3.自定义类型成员(且该类没有默认构造函数时)。

class A
{
public:A(int a):_a(a){}
private:int _a;
};
class B
{
public:B(int a, int ref):_aobj(a),_ref(ref),_n(10){}
private:A _aobj; // 没有默认构造函数int& _ref; // 引用const int _n; // const 
};

3.尽量使用初始化列表初始化,因为不管你是否使用初始化列表,对于自定义类型成员变量,一定会先使 用初始化列表初始化。

4. 成员变量在类中声明次序就是其在初始化列表中的初始化顺序,与其在初始化列表中的先后次序无关。

class A
{
public:A(int a):_a1(a),_a2(_a1){}void Print() {cout<<_a1<<" "<<_a2<<endl;}
private:int _a2;int _a1;
};
int main() {A aa(1);aa.Print();
}

上述代码运行结果是什么呢?

A. 输出1 1     B.程序崩溃     C.编译不通过     D.输出1 随机值

答案为D

上述规则中我们知道初始化列表会先执行声明的成员变量,我们可以看到类中先声明的成员变量为_a2,然后为_a1,这样的话在初始化列表中先初始化_a2,但是给_a2的初始化值为_a1,但是此时的_a1还未初始化,所以_a2为随机值,_a1为a。



2.explicit关键字

构造函数不仅可以构造与初始化对象,对于单个参数或者除第一个参数无默认值其余均有默认值的构造函 数,还具有类型转换的作用。

上述代码中存在一个只需要传一个int 类型参数的构造函数,正是这一点我们可以写出下面的隐式类型转换,我们写的A b1 =2,意思其实是提供一个2给构造函数,创建一个临时的对象吗,然后再拷贝构造给b1对象(当然,如果是多个形参也可以,只是需要用花括号括起来)。

那么这里与explicit有何关系呢?

我们只需要在对应的构造函数前加上该关键字,就可以让其不发生隐式类型转换。

 

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【C语言】简易版扫雷游戏(数组、函数的练习)
  • 05-ArcGIS For JavaScript-RenderNode后处理效果
  • [012-1].第12节:Mysql的配置文件的使用
  • ubuntu安装workon
  • MyBatis缓存
  • DataKit之OpenGauss数据迁移工具
  • 大数据技术基础编程、实验和案例----大数据课程综合实验案例
  • SpringBoot如何实现简单的跨域配置
  • (七)Appdesigner-初步入门及常用组件的使用方法说明
  • 程序员修炼之路
  • vue3 动态加载组件
  • web文件上传与下载
  • 【附安装包】CentOS7(Linux)详细安装教程(手把手图文详解版)
  • Selenium 无法定位元素的几种解决方案
  • masscan 端口扫描——(Golang 简单使用总结)
  • [deviceone开发]-do_Webview的基本示例
  • angular2开源库收集
  • Java|序列化异常StreamCorruptedException的解决方法
  • Laravel 中的一个后期静态绑定
  • linux学习笔记
  • Vue小说阅读器(仿追书神器)
  • zookeeper系列(七)实战分布式命名服务
  • 那些被忽略的 JavaScript 数组方法细节
  • 容器服务kubernetes弹性伸缩高级用法
  • 如何实现 font-size 的响应式
  • 深度解析利用ES6进行Promise封装总结
  • 问:在指定的JSON数据中(最外层是数组)根据指定条件拿到匹配到的结果
  • 学习Vue.js的五个小例子
  • 用Visual Studio开发以太坊智能合约
  • 国内开源镜像站点
  • ​VRRP 虚拟路由冗余协议(华为)
  • # Python csv、xlsx、json、二进制(MP3) 文件读写基本使用
  • # 利刃出鞘_Tomcat 核心原理解析(二)
  • #我与Java虚拟机的故事#连载09:面试大厂逃不过的JVM
  • $().each和$.each的区别
  • $(selector).each()和$.each()的区别
  • (07)Hive——窗口函数详解
  • (12)Hive调优——count distinct去重优化
  • (2024.6.23)最新版MAVEN的安装和配置教程(超详细)
  • (4)(4.6) Triducer
  • (PWM呼吸灯)合泰开发板HT66F2390-----点灯大师
  • (Redis使用系列) SpringBoot 中对应2.0.x版本的Redis配置 一
  • (ZT)北大教授朱青生给学生的一封信:大学,更是一个科学的保证
  • (八)c52学习之旅-中断实验
  • (多级缓存)缓存同步
  • (附源码)spring boot球鞋文化交流论坛 毕业设计 141436
  • (九)c52学习之旅-定时器
  • (力扣题库)跳跃游戏II(c++)
  • (七)Activiti-modeler中文支持
  • (四)七种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (四)软件性能测试
  • .net core webapi 大文件上传到wwwroot文件夹
  • .NET IoC 容器(三)Autofac
  • .NET6使用MiniExcel根据数据源横向导出头部标题及数据
  • .net经典笔试题