C++从入门到起飞之——初始化列表类型转换static成员 全方位剖析!

🌈个人主页:秋风起,再归来~
🔥系列专栏:C++从入门到起飞          
🔖克心守己,律己则安

目录

1、初始化列表

2、 类型转换

3. static成员

4、完结散花


1、初始化列表

• 之前我们实现构造函数时,初始化成员变量主要使⽤函数体内赋值,构造函数初始化还有⼀种⽅ 式,就是初始化列表,初始化列表的使⽤⽅式是以⼀个冒号开始,接着是⼀个以逗号分隔的数据成 员列表,每个"成员变量"后⾯跟⼀个放在括号中的初始值或表达式

class Date
{
public:Date(int year = 10, int month = 10, int day = 10):_year(2024)//常量,_month(month)//变量,_day(day*3+1)//表达式{//......}private:int _year;int _month;int _day;
};

• 每个成员变量在初始化列表中只能出现⼀次,语法理解上初始化列表可以认为是每个成员变量定义 初始化的地⽅。

引⽤成员变量const成员变量没有默认构造的类类型变量必须放在初始化列表位置进⾏初始 化,否则会编译报错

class Time
{
public:Time(int hour):_hour(hour){//......}private:int _hour;
};class Date
{
public:Date(int year = 10, int month = 10, int day = 10):_year(2024)//常量,_month(month)//变量,_day(day*3+1)//表达式//, _day(day)//表达式{//......}private:int _year;int _month;int _day;int& _ra;//引用成员变量Time _t;//没有默认构造的类类型变量const int _n;//const
};

• C++11⽀持在成员变量声明的位置给缺省值,这个缺省值主要是给没有显⽰在初始化列表初始化的 成员使⽤的。

• 尽量使⽤初始化列表初始化,因为那些你不在初始化列表初始化的成员也会⾛初始化列表,如果这 个成员在声明位置给了缺省值,初始化列表会⽤这个缺省值初始化。如果你没有给缺省值,对于没 有显⽰在初始化列表初始化的内置类型成员是否初始化取决于编译器,C++并没有规定。对于没有 显⽰在初始化列表初始化的⾃定义类型成员会调⽤这个成员类型的默认构造函数,如果没有默认构 造会编译错误。

class Time
{
public:Time(int hour):_hour(hour){//......}private:int _hour;
};class Date
{
public:Date(int year = 10, int month = 10, int day = 10,int hour)//:_year(2024)//常量//,_month(month)//变量//,_day(day*3+1)//表达式//, _day(day)//表达式:_ra(year),_t(hour),_n(24){//......}private:int _year=2024;int _month=7;int _day=26;int& _ra;//引用成员变量Time _t;//没有默认构造的类类型变量const int _n;//const
};

• 初始化列表中按照成员变量在类中声明顺序进⾏初始化,跟成员在初始化列表出现的的先后顺序⽆ 关。建议声明顺序和初始化列表顺序保持⼀致。

#include<iostream>
using namespace std;
class A
{
public:A(int a):_a1(a), _a2(_a1){}void Print() {cout << _a1 << " " << _a2 << endl;}
private:int _a2 = 2;int _a1 = 2;
};
int main()
{A aa(1);aa.Print();
}

上⾯程序的运⾏结果是什么()

A.输出1 1

B.输出2 2 

C.编译报错

D.输出1 随机值

E.输出1 2

F.输出2 1

 根据运行结果,我们知道这个题目的答案是D

2、 类型转换

• C++⽀持内置类型隐式类型转换类类型对象,需要有相关内置类型为参数的构造函数

class A
{
public:A(int a1=10,int a2=10):_a1(a1),_a2(a2){}void Print(){cout << _a1 << " " << _a2 << endl;}
private:int _a1 = 10;int _a2 = 10;
};int main()
{// 1构造⼀个A的临时对象,再⽤这个临时对象拷⻉构造aa3// 编译器遇到连续构造+拷⻉构造->优化为直接构造A aa1=1;//==A aa1(1);aa1.Print();// C++11之后才⽀持多参数转化A aa2 = { 1,2 };//==A aa1(1,2);aa2.Print();return 0;
}

• 构造函数前⾯加explicit就不再⽀持隐式类型转换

3. static成员

• ⽤static修饰的成员变量,称之为静态成员变量,静态成员变量⼀定要在类外进⾏初始化

class A
{
public:A(){++count;}~A(){--count;}
private:static int count;
};
//一定要在类外进行初始化
int A::count = 0;int main()
{return 0;
}

• 静态成员变量为所有类对象所共享,不属于某个具体的对象,不存在对象中,存放在静态区。 

• ⽤static修饰的成员函数,称之为静态成员函数,静态成员函数没有this指针

静态成员函数中可以访问其他的静态成员,但是不能访问⾮静态的,因为没有this指针

class A
{
public:A(){++count;}~A(){--count;}static void func(){//可以访问静态成员cout << count << endl;//不可以访问非静态成员//cout << a << endl;}private:static int count;int a;
};
//一定要在类外进行初始化
int A::count = 0;int main()
{cout << sizeof(A) << endl;return 0;
}

⾮静态的成员函数,可以访问任意的静态成员变量和静态成员函数

突破类域就可以访问静态成员,可以通过类名::静态成员或者对象.静态成员来访问静态成员变量 和静态成员函数。

• 静态成员也是类的成员,受public、protected、private访问限定符的限制

静态成员变量不能在声明位置给缺省值初始化,因为缺省值是给构造函数初始化列表的,静态成员 变量不属于某个对象,不⾛构造函数初始化列表。

我们来看一个小练习~

设已经有A,B,C,D4个类的定义,程序中A,B,C,D构造函数调⽤顺序为?()

设已经有A,B,C,D4个类的定义,程序中A,B,C,D析构函数调⽤顺序为?()

C c;
int main()
{A a;B b;static D d;return 0;
}

构造函数调用的顺序就是创建对象的顺序!

而析构函数调用的顺序就要先看对象的生命周期了,C定义在全局,所以C是最后调用析构函数,A与B谁后定义谁先析构,D对象是静态的,在main函数结束时调用析构函数!

4、完结散花

好了,这期的分享到这里就结束了~

如果这篇博客对你有帮助的话,可以用你们的小手指点一个免费的赞并收藏起来哟~

如果期待博主下期内容的话,可以点点关注,避免找不到我了呢~

我们下期不见不散~~

​​​​

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/50611.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[Unity] ShaderGraph实现DeBuff污染 溶解叠加效果

本篇是在之前的基础上&#xff0c;继续做的功能衍生。 [Unity] ShaderGraph实现Sprite消散及受击变色 完整连连看如下所示&#xff1a;

简洁高效的设备稼动率采集系统(一)

前言&#xff1a; 在自动化生产行业&#xff0c;每个公司都需要一款高效的生产设备&#xff0c;那我们怎么体现出设备的高效呢&#xff1f; 可以采集设备的状态&#xff0c;经过成熟的算法&#xff0c;得到设备的稼动率。设备稼动率是衡量生产设备在一定时间内真正处于生产状态…

Django学习(二)

get请求 练习&#xff1a; views.py def test_method(request):if request.method GET:print(request.GET)# 如果链接中没有参数a会报错print(request.GET[a])# 使用这个方法&#xff0c;当查询不到参数时&#xff0c;不会报错而是返回你设置的值print(request.GET.get(c,n…

ElasticSearch(三)—文档字段参数设置以及元字段

一、 字段参数设置 analyzer&#xff1a; 指定分词器。elasticsearch 是一款支持全文检索的分布式存储系统&#xff0c;对于 text类型的字段&#xff0c;首先会使用分词器进行分词&#xff0c;然后将分词后的词根一个一个存储在倒排索引中&#xff0c;后续查询主要是针对词根…

echarts使用案例

1.配置legend icon 根据点击事件动态更换样式 <template><div ref"chart" style"width: 600px; height: 400px;"></div></template><script>import * as echarts from echarts;export default {name: EchartsExample,data(…

C语言第三天笔记

变量 概念 表面&#xff1a;程序运行过程中取值可以改变的数据 实质&#xff1a;变量其实代表了一块内存区域/单元/空间。变量名可视为该区域的标识。 整个变量分为三部分&#xff1a; 变量名&#xff1a;这个只是变量的一个标识&#xff0c;我们借助变量名来存取数据。 变…

Element快速学习

博客主页&#xff1a;音符犹如代码系列专栏&#xff1a;JavaWeb关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ 什么是Element&#xff1f; Element&#xff1a;它是由饿了么团队开发的一个…

盛元广通实验室自动化生物样本库质量控制管理系统

随着我国生物医学研究的不断深入和精准医疗的快速发展&#xff0c;对高质量生物样本的需求日益增长。近年来&#xff0c;我国生物样本库建设取得了显著进展。各级政府、高校和医院纷纷投入资源建设生物样本库&#xff0c;推动了生物样本资源的有效整合和利用。生物样本库的质量…

Footprint Analytics 助力 Core 区块链实现数据效率突破

Core 是一个基于比特币并兼容 EVM 的 Layer 1 区块链&#xff0c;正通过其创新解决方案引革新特币金融。作为首个引入非托管 BTC 质押协议及全球首个发行收益型 BTC ETP 产品的区块链&#xff0c;Core 站在了区块链技术的最前沿。通过利用超过 50% 的比特币挖矿哈希算力&#x…

QEMU源码全解析 —— CPU虚拟化(11)

接前一篇文章: 本文内容参考: 《趣谈Linux操作系统》 —— 刘超,极客时间 《QEMU/KVM》源码解析与应用 —— 李强,机械工业出版社 《深度探索Linux系统虚拟化原理与实现》—— 王柏生 谢广军, 机械工业出版社 特此致谢! 前边几回又再次讲了一下VMX,本回开始讲解VCPU…

vue3 使用Mock

官网: http://mockjs.com/ 安装 npm install mockjs -Dsteps1: main.js 文件引入 import /api/mock.jssteps2: src/api/mock.js import Mock from mockjs import homeApi from ./mockData/home /*** 1.拦截的路径:mock拦截了正常NetWork/网络请求,数据正常响应* 2.方法* …

【苍穹】完美解决由于nginx更换端口号导致无法使用Websocket

一、报错信息 进行到websocket开发的过程中&#xff0c;遇到了前端报错&#xff0c;无法连接的提示&#xff1a; 经过F12排查很明显是服务端和客户端并没有连接成功。这里就涉及到之前的坑&#xff0c;现在需要填上了。 二、报错原因和推导 应该还记得刚开苍穹的第一天配置前…

Java集合——Array、ArrayList、LinkedList

1. ArrayList和Array的区别 1. 大小和自动扩容 Array&#xff1a;创建时指定大小&#xff0c;大小固定。若数组被创建&#xff0c;其大小不能更改 ArrayList&#xff1a;动态数组实现&#xff0c;可以动态增长或缩小。在不断添加元素时&#xff0c;ArrayList会自动进行扩容 …

MySQL大框架总结

1.DDL,DML,DQL,DCL的区别 &#xff08;由于DCL是关乎用户的&#xff0c;以下内容重点讲述数据库&#xff0c;表与数据的操作&#xff0c;所以对DCL不详细赘述&#xff09; DDL DML DQL DCL 中文/英文 数据库定义语言 data definition language 数据库操作语言 data mani…

为什么多数大数据治理项目都是失败的?Gartner调查失败率超过90%

引言&#xff1a;随着数据规模的爆发式增长、数据价值的凸显以及数据治理的必要性。在政策的推动、市场需求的拉动以及技术进步的支撑下&#xff0c;大数据治理正成为推动企业数字化转型、提升数据价值的重要手段。企业希望通过大数据治理提升数据利用率和数据价值&#xff0c;…

19 Python常用内置函数——range()

range() 是 Python 开发中非常常用的一个内置函数。该函数返回具有惰性求值特点的 range 对象&#xff0c;其中包含左闭右开区间 [start, end) 内以 step 为步长的整数。 参数 start 默认为 0&#xff0c;step 默认为 1。 print(range(5)) print(list(range(5))) print(list(r…

2024中国大学生算法设计超级联赛(2)

&#x1f680;欢迎来到本文&#x1f680; &#x1f349;个人简介&#xff1a;陈童学哦&#xff0c;彩笔ACMer一枚。 &#x1f3c0;所属专栏&#xff1a;杭电多校集训 本文用于记录回顾总结解题思路便于加深理解。 &#x1f4e2;&#x1f4e2;&#x1f4e2;传送门 A - 鸡爪解题思…

华为高品质万兆园区体验保障技术白皮书

华为高品质万兆园区体验保障技术白皮书 - 华为企业业务 re 音视频会议已经成为企业办公的核心应用系统&#xff0c;尤其是高层会议的质量对企业的运营效率有很大影响&#xff0c;相 关的体验问题也是员工投诉的重灾区。但不同于传统的网络通断类问题,体验类问题涉及的范围大、…

vue3 暴露网络地址,以及修改端口号

一般情况下这里的地址是隐藏的 这里加上 --host 可以暴露网络地址&#xff0c;再加上 --8080 就可以将端口号修改为8080&#xff08;修改为其它的当然也可以&#xff09;

[AI科普] 2024人工智能指数报告解读

1. 前言&#xff1a; 本周分享了&#xff0c;关于斯坦福以人为本人工智能研究室发布的&#xff0c;《2024年人工智能指数报告》的解读&#xff0c;主要是结合了快刀青衣哥的一些解读。在此基础上&#xff0c;又增加了一些国内外的AI发展现状&#xff0c;欧洲杯中体现的人工智能…