初始化列表与Static成员

一、再谈构造函数

1.1构造函数体赋值

在创建对象时,编译器会调用构造函数,给对象中各个成员变量一个合适的初始值

class Date
{
private:int _year;int _month;int _day;
public:Date(int year, int month, int day){_year = year;_month = month;_day = day;}
};

上述代码调用构造函数后,对象中已经有了一个初始值,但并不能将其称为对对象中成员变量的初始化,这只能称其为在构造函数体中对成员变量赋初始值,而不是初始化。因为成员变量的初始化只能在创建时初始化一次,而构造函数体中的进行多次赋值

1.2初始化列表

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

class Date
{
private:int _year;int _month;int _day;
public:Date(int year, int month, int day)//成员变量的初始化在进入函数体前就已经进行了:_year(year),_month(month),_day(day)   //不能使用等号如_day = day;{}
};

注: 

1.每个成员变量在初始化列表中只能出现一次(初始化只能初始化一次)

2.类中包含以下成员函数,必须放在初始化列表中初始化。

  • 引用成员变量
  • const成员变量
  • 自定义类型成员(且该类没有默认构造函数时)
    class A
    {
    private:int _a;
    public:A(int a):_a(a){}
    };
    class Date
    {
    private:const int _year;int& _month;A _day;
    public:Date(int year, int month, int day)//:_year(year),//_month(month)//_day(day){_year = 1;_month = 1;_day = 1;}
    };

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

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

1.3explicit关键字

构造函数不仅可以构造与初始化对象,对于接收单个参数的构造函数,还具有类型转换的作用。接收单个参数的构造函数具体表现:

1.构造函数只有一个参数

2.构造函数有多个参数,除第一个参数没有默认值外,其余参数都有默认值

3.全缺省构造函数

类型转化:

class MyClass {
public:// 构造函数,可以接受 int 类型MyClass(int x) {cout << "MyClass(int x) " << x << endl;}
};
void printObject(const MyClass& obj) {cout << "printObject(const MyClass& obj)" << endl;
}
int main() {MyClass obj = 42;  // 隐式转换:int 转换为 MyClass 对象printObject(42);   // 隐式转换:int 被转换为 MyClass 对象
}

以上代码就是类型转换,但这种转换有时会发生不确定性的行为。因此explicit关键字就是用来禁止构造函数进行类型转换的。使用方法就是在构造函数前加上explicit

class MyClass {
public:explicit MyClass(int x) {cout << "MyClass(int x) " << x << endl;}
};
void printObject(const MyClass& obj) {cout << "printObject(const MyClass& obj)" << endl;
}
int main() {MyClass obj = 42;printObject(42); 
}

二、Static

2.1概念

声明为static的类成员称为类的静态成员,用static修饰的成员变量,称为静态成员变量。用static修饰的成员函数,称为静态成员函数静态成员函数必须在类的外面进行初始化

class A
{
public:static int ads() {;}
private:static int _a; //声明
};
int A::_a = 0;//静态成员变量的初始化

2.2特性

1.静态成员是所有类对象共享的,不属于某个具体的对象,存放在静态区

class A
{
public:A() {++_scount; }A(const A& t) {++_scount; }~A() {--_scount; }static int GetACount() {return _scount; }
private:static int _scount;
};
int A::_scount = 0;
void TestA()
{cout << A::GetACount() << endl;A a1, a2;A a3(a1);cout << A::GetACount() << endl;
}
int main()
{TestA();return 0;
}

 运行结果:

当取消static关键字时,代码如下:

class A
{
public:A(int a = 1) {_a = a;}A(const A& t) {_a = 3;}int GetACount() {return _a;}
private:int _a;
};
void TestA()
{A a1, a2(2);cout << a1.GetACount() << endl;cout << a2.GetACount() << endl;A a3(a1);cout << a3.GetACount() << endl;
}
int main()
{TestA();return 0;
}

运行结果:

我们可以发现每个对象中都会生成一个_a成员变量,互不影响

2.静态成员变量必须在类外定义,定义是不添加static,类中只是声明

class A
{
public:static int ads() {;}
private:static int _a; //声明
};
int A::_a = 0;//静态成员变量的初始化

3.类静态成员即可以类名::静态成员对象.静态成员进行访问

4.静态成员函数没有隐藏的this指针不能访问任何非静态成员

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

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

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

相关文章

THENA大涨将对整个DeFi市场产生怎样的影响?

引言 近期&#xff0c;区块链行业的一个热门项目——THENA&#xff08;THE&#xff09;代币&#xff0c;在短时间内吸引了大量投资者的目光。THE代币的价格在短短几个月内经历了显著的上涨&#xff0c;引发了市场对其背后机制的浓厚兴趣。而在THENA生态系统的成功背后&#xf…

从被动响应到主动帮助,ProActive Agent开启人机交互新篇章

在人工智能领域&#xff0c;我们正见证着一场革命性的变革。传统的AI助手&#xff0c;如ChatGPT&#xff0c;需要明确的指令才能执行任务。但现在&#xff0c;清华大学联合面壁智能等团队提出了一种全新的主动式Agent交互范式——ProActive Agent&#xff0c;它能够主动观察环境…

SpringBoot(一)

Springboot(一) 什么是SpringBoot SpringBoot是Spring项目中的一个子工程&#xff0c;与Spring-famework同属于Spring的产品 用一些固定的方式来构建生产级别的Spring应用。SpringBoot推崇约定大于配置的方式以便于能够尽可能快速的启动并运行程序 我们把Spring Boot称为搭建程…

PDF与PDF/A的区别及如何使用Python实现它们之间的相互转换

目录 概述 PDF/A 是什么&#xff1f;与 PDF 有何不同&#xff1f; 用于实现 PDF 与 PDF/A 相互转换的 Python 库 Python 实现 PDF 转 PDF/A 将 PDF 转换为 PDF/A-1a 将 PDF 转换为 PDF/A-1b 将 PDF 转换为 PDF/A-2a 将 PDF 转换为 PDF/A-2b 将 PDF 转换为 PDF/A-3a 将…

【设计模式系列】备忘录模式(十九)

目录 一、什么是备忘录模式 二、备忘录模式的角色 三、备忘录模式的典型应用场景 四、备忘录模式在Calendar中的应用 一、什么是备忘录模式 备忘录模式&#xff08;Memento Pattern&#xff09;是一种行为型设计模式&#xff0c;它允许在不暴露对象内部状态的情况下保存和恢…

window 下用Ollama 开发一个简单文档问答系统

文档问答系统 本系统利用先进的语言模型和检索技术&#xff0c;为用户提供基于上传文件内容的问答服务。支持多种文件格式&#xff0c;包括 Word、PDF、CSV、SQL 和 TXT 文件。 功能介绍 文件上传 用户可以同时上传多个文件。支持的文件类型包括&#xff1a;.doc, .docx, .…

全国296个地级市平均房价数据(2000-2022年)

全国296个地级市平均房价数据(2000-2022年)&#xff0c;包括面板数据和截面数据 点击下载 1、数据来源&#xff1a;安居客、房天下、房价行情网等住房交易网页整理 2、时间跨度&#xff1a;2000-2022年 3、区域范围&#xff1a;全国296个地级市 4、缺失说明&#xff1a;西…

贴片式内存卡 ​SD NAND​

SD NAND FLASH 贴片式SD卡 贴片式t卡 存储芯片 1. 什么是贴片式内存卡 贴片式内存卡是指一种将内存芯片直接贴装在电路板上的内存卡类型。与传统的插针式内存卡&#xff08;如SD卡、MicroSD卡&#xff09;不同&#xff0c;贴片式内存卡通常不具有外部引脚或接口&#xff0c;而…

C—操作符易错点

strlen与sizeof strlen求的是大小&#xff0c;包含“\0” strlen求的是&#xff0c;长度不包括“\0” 注意&#xff1a;空格也算一个字符 操作符“/”(除法&#xff09; 对于除法操作符来说&#xff0c;两边都是整数&#xff0c;那么就是整数除法 如果想计算出小数&#x…

基于PyTorch框架的线性回归实现指南

目录 ​编辑 1. 线性回归基础 2. PyTorch环境搭建 3. 数据准备 4. 定义线性回归模型 5. 损失函数和优化器 6. 训练模型 7. 评估模型 8. 结论 线性回归是统计学和机器学习中最基本的预测模型之一&#xff0c;它试图找到输入特征和输出结果之间的线性关系。在深度学习框…

R语言机器学习论文(六):总结

文章目录 介绍参考文献介绍 本文采用R语言对来自进行数据描述、数据预处理、特征筛选和模型构建。 最后我们获得了一个能有效区分乳腺组织的随机森林预测模型,它的性能非常好,这意味着它可能拥有非常好的临床价值。 在本文中,我们利用R语言对来自美国加州大学欧文分校的B…

基于Java Springboot校园导航微信小程序

一、作品包含 源码数据库设计文档万字PPT全套环境和工具资源部署教程 二、项目技术 前端技术&#xff1a;Html、Css、Js、Vue、Element-ui 数据库&#xff1a;MySQL 后端技术&#xff1a;Java、Spring Boot、MyBatis 三、运行环境 开发工具&#xff1a;IDEA/eclipse微信开发…

面试题-RocketMQ的基本架构、支持的消息模式、如何保证消息的可靠传输

相关问题 1、RocketMQ的基本架构是怎样的&#xff1f;请简述各组件的作用。 2、RocketMQ支持哪几种消息模式&#xff08;如点对点、发布/订阅&#xff09;&#xff1f;请简要说明它们的区别。 3、如何使用Java客户端实现一个简单的消息生产者和消费者&#xff1f; 4、RocketMQ…

WPF+LibVLC开发播放器-LibVLC在C#中的使用

使用WPFLibVLC快速 开发一个播放器 安装包Nuget 安装下面两个包,必须安装两个 一个是相关框架对应的包&#xff0c;Winform就安装LibVLCSharp.Winform;WPF就安装LibVLCSharp.WPF&#xff0c;以此类推&#xff0c;他们都默认依赖LibVLCSharp&#xff0c;不需要例外安装 一个是…

CSS变量用法及实践

目录 一、基本用法 1.1、定义变量 1.2、使用变量 1.3 、修改变量的值 二、命名规范 2.1、使用有意义的名称 2.2、使用命名空间 三、变量值类型 3.1、如果变量值是一个字符串&#xff0c;可以与其他字符串拼接&#xff0c;例如&#xff1a; 3.2、 如果变量值是数值&a…

WEB开发: 丢掉包袱,拥抱ASP.NET CORE!

今天的 Web 开发可以说进入了一个全新的时代&#xff0c;前后端分离、云原生、微服务等等一系列现代技术架构应运而生。在这个背景下&#xff0c;作为开发者&#xff0c;你一定希望找到一个高效、灵活、易于扩展且具有良好性能的框架。那么&#xff0c;ASP.NET Core 显然是一个…

【汇编语言】标志寄存器(一) —— 标志寄存器中的标志位:ZF、PF、SF、CF、OF 一网打尽

前言 &#x1f4cc; 汇编语言是很多相关课程&#xff08;如数据结构、操作系统、微机原理&#xff09;的重要基础。但仅仅从课程的角度出发就太片面了&#xff0c;其实学习汇编语言可以深入理解计算机底层工作原理&#xff0c;提升代码效率&#xff0c;尤其在嵌入式系统和性能优…

纯Go语言开发人脸检测、瞳孔/眼睛定位与面部特征检测插件-助力GoFly快速开发框架

前言​ 开发纯go插件的原因是因为目前 Go 生态系统中几乎所有现有的人脸检测解决方案都是纯粹绑定到一些 C/C 库&#xff0c;如 ​​OpenCV​​ 或 ​​​dlib​​​&#xff0c;但通过 ​​​cgo​​​ 调用 C 程序会引入巨大的延迟&#xff0c;并在性能方面产生显著的权衡。…

2、Three.js初步认识场景Scene、相机Camera、渲染器Renderer三要素

三要素之间关系&#xff1a; 有了虚拟场景Scene&#xff0c;相机录像Camera&#xff0c;在相机小屏幕上看到的Renderer Scene当前空间 Mesh人在场景 Camera相机录像 Renderer显示器上 首先先描述下Scene&#xff1a; 这个场景为三要素之一&#xff0c;一切需要展示的东西都需…

电子电气架构 --- 车载网关GW连接外部IP Tester

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 所谓鸡汤,要么蛊惑你认命,要么怂恿你拼命,但都是回避问题的根源,以现象替代逻辑,以情绪代替思考,把消极接受现实的懦弱,伪装成乐观面对不幸的…