【C++】类和对象——初始化列表和static修饰成员

首先我们来谈一下初始化列表,它其实是对于我们前边构造函数体内初始化的一种补充,换一种说法,它以后才是我们构造函数的主体部分。
我们先考虑一个问题,就是一个类里面有用引用const初始化的成员变量,比如说:
在这里插入图片描述
在构造函数中我们是不能给c和d进行赋值的,因为这两种类型只能在初始化时去赋值,在这种情况下,我们的初始化列表就有用处了
我首先写一下它的基本用法,就是语法所规定

A(int aa=1,int bb=2,int cc=3)
	:a(aa)//初始化列表初始化
	,b(bb)
	,c(cc)
	,d(0)
{
	//函数体内初始化
}

这其实就是一个构造函数,两个大括号之间的就是我们之前所见过的构造函数在函数体内初始化,而上面所加的就是这里要说的初始化列表初始化,并且它们是可以混着用
下面一个问题,我如果在初始化列表不显示写(比如a成员的初始化),那么它还会不会初始化a这个成员变量?
答案是,因为初始化列表会初始化所有成员变量,即使你不写。为什么呢?我们之前是不是说过如果一个内置类型不写构造函数,它会被默认初始化为随机值,而对于一个没写构造函数的自定义类型则会去调用它的默认构造函数,这个过程实际上就是在初始化列表完成的。还有一个现象,就是我们会给成员变量缺省值,如果没有给构造函数,就会按缺省值来,这个过程也是在初始化列表完成的
除了这引用和const修饰的成员变量,还有自定义类型无默认构造或者说就算有默认构造但是我不想用给的缺省值我想自己传,这种情况需要用初始化列表,

#include<iostream>
using namespace std;
class B {
public:
	B(int ret1) {
		_ret = ret1;
	}
private:
	int _ret;
};
class A {
public:
	A(int aa = 1, int bb = 2, int cc = 3)
		:a(aa)//初始化列表初始化
		, c(cc)
		, d(0)
		, r(0)
{
	//函数体内初始化
}
private:
	int a;
	char b;
	int& c;
	const int d;
	B r;
};
int main() {
	A a;
	return 0;
}

那么能不能取消掉函数体呢(就是构造函数里的大括号及里面的东西)?当然不能,函数体内可以做一些检查和初始化的工作,这是初始化列表做不了的,比如说:
在这里插入图片描述
最后要知道初始化列表初始化的顺序声明顺序
在这里插入图片描述
而不是初始化列表中写的顺序
在这里插入图片描述
下面一个例子可以证明一下
在这里插入图片描述
就是先用_b初始化_a,此时_b还是随机值,所以第一个打印随机值
请添加图片描述
下一个问题就是我们的static修饰成员,这里的成员包括成员变量和成员函数,我们先来看成员变量,
有这样一个问题,就是我们想看一下一个类创建了多少个对象,我们该怎么做呢?我们当然可以创建一个全局变量,每当调用构造函数或者拷贝构造时就让它++,这样是没问题的,但假如有多个类呢?并且这个全局变量也容易被更改。我们这时用static变量就显得很好了,下面先说一下它的声明和定义形式
在这里插入图片描述
下面我们就可以写统计一共创建了多少个对象的代码了

class A {
public:
	A(int ret = 1) {
		_a = ret;
		count++;
	}
	A(const A& aa) {
		_a = aa._a;
		count++;

	}
	int getcount() {
		return count;
	}
private:
	int _a;
	static int count;//声明
};
int A::count = 0;//定义
A Func() {
	A a;
	return a;
}
int main() {
	A a;
	Func();
	cout << a.getcount() << endl;
	return 0;
}

我们这里成员变量是私有的,可以给一个函数把count的值传出来,并且这个函数还有一个好处就是我们无法修改count的值
其实static修饰的成员变量可以看成专属于某个类的全局变量,用sizeof计算对象大小时也是不算static修饰的变量的大小的
下面是static修饰的成员函数,基本形式像下面这样
在这里插入图片描述

在这里插入图片描述
调用可以上面这两种方法调用,如果不用static修饰,第一种调用是不行的,并且它是没有this指针的,因为用static修饰,不管是变量还是函数都像一个专属这个类的全局的一样

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【【FPGA 之 MicroBlaze 自定义IP核 之 呼吸灯实验】】

FPGA 之 MicroBlaze 自定义IP核 之 呼吸灯实验 通过创建和封装 IP 向导的方式来自定义 IP 核&#xff0c;支持将当前工程、工程中的模块或者指定文件目录封装成 IP 核&#xff0c;当然也可以创建一个带有 AXI4 接口的 IP 核&#xff0c;用于 MicroBlaze 软核处理器和可编程逻辑…

kubernetes中YAML介绍;API资源对象Pod;Pod原理和生命周期;Pod资源限制

YAML介绍&#xff1b;API资源对象Pod&#xff1b;Pod原理和生命周期&#xff1b;Pod资源限制 1&#xff09;认识YAML 官网&#xff08;https://yaml.org/&#xff09; YAML 语言创建于 2001 年&#xff0c;比 XML 晚了三年。YAML虽然在名字上模仿了XML&#xff0c;但实质上与…

Spring之RestTemplate详解

Spring之RestTemplate详解 1 RestTemplate1.1 引言1.2 环境配置1.2.1 非Spring环境下使用RestTemplate1.2.2 Spring环境下使用 RestTemplate1.2.3 Spring环境下增加线程号 1.3 API 实践1.3.1 GET请求1.3.1.1 不带参请求1.3.1.2 带参的get请求(使用占位符号传参)1.3.1.3 带参的g…

西南科技大学模拟电子技术实验四(集成运算放大器的线性应用)预习报告

一、计算/设计过程 说明:本实验是验证性实验,计算预测验证结果。是设计性实验一定要从系统指标计算出元件参数过程,越详细越好。用公式输入法完成相关公式内容,不得贴手写图片。(注意:从抽象公式直接得出结果,不得分,页数可根据内容调整) 反相比例运算电路(1)实验…

VMware Workstation Pro 17及 Windows 11 虚拟机的安装与激活

六点钟&#xff1a; 吃晚饭吗 不吃&#xff0c;胖胖 十点钟&#xff1a; 阿昊要吃夜宵对不对 ——CSDN&#xff0c;记录牛马生活 本文是在学习 Linux 期间&#xff0c;使用 VMware 时顺带学习 Windows 11 虚拟机的安装与激活 VMware Workstation Pro 17及 Windows 11 虚拟机…

MacDroid Pro for Mac – 安卓设备文件传输助手,实现无缝连接与传输!

想要在Mac电脑上轻松管理和传输您的安卓设备文件吗&#xff1f;MacDroid Pro for Mac 是您的最佳选择&#xff01;这款强大的文件传输助手可以让您在Mac上与安卓设备之间实现快速、方便的文件传输。 MacDroid Pro for Mac 提供了简单易用的界面&#xff0c;让您能够直接在Mac上…

基于Springboot + vue的汽车资讯网站

qq&#xff08;2829419543&#xff09;获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;springboot 前端&#xff1a;采用vue技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xf…

Vue学习记录

Vue学习记录 一、搭建Vue开发环境 到官网下载安装Vue&#xff1a;安装 — Vue.js (vuejs.org) ----->点击开发版下载 怎么解决&#xff1f; 到官网&#xff1a;安装 — Vue.js 点击&#xff1a; 下滑找到&#xff1a; 下载相应的版本的就行&#xff1a; 下载拓展后刷新…

Collection的其他相关知识

前置知识&#xff1a;可变参数 就是一种特殊参数&#xff0c;定义在方法 构造器的形参列表里&#xff0c;格式是&#xff1a;数据类型...参数名称&#xff1b; 可变参数的特点和好处 特点&#xff1a;可以不传数据给它&#xff1b;可以传一个或者同时传多个数据给它&#xff…

Halcon tiff 点云读取以及平面矫正

一、读取tiff 图 dev_close_window () dev_open_window (0, 0, 512, 512, black, WindowHandle)xResolution:0.0025 yResolution:0.0025 zResolution:0.001 read_image (IntputImage, C:/Users/alber/Desktop/2023-08-15_16-38-24-982_/Sta5_002.tif) zoom_image_factor (Intpu…

YOLOv8改进 | 2023 | 给YOLOv8换个RT-DETR的检测头(重塑目标检测前沿技术)

一、本文介绍 本文给大家带来是用最新的RT-DETR模型的检测头去替换YOLOv8中的检测头。RT-DETR号称是打败YOLO的检测模型&#xff0c;其作为一种基于Transformer的检测方法&#xff0c;相较于传统的基于卷积的检测方法&#xff0c;提供了更为全面和深入的特征理解&#xff0c;将…

【探索Linux】—— 强大的命令行工具 P.19(多线程 | 线程的概念 | 线程控制 | 分离线程)

阅读导航 引言一、 Linux线程概念1. 什么是线程2. 线程的概念3. 线程与进程的区别4. 线程异常 二、Linux线程控制1. POSIX线程库2. 创建线程 pthread_create() 函数&#xff08;1&#xff09;头文件&#xff08;2&#xff09;函数原型&#xff08;3&#xff09;参数解释&#x…

初识消息队列

1、消息 消息&#xff08;Message&#xff09;是指在应用间传送的数据。消息可以非常简单&#xff0c;比如只包含文本字符串&#xff0c;也可以更复杂&#xff0c;可能包含嵌入对象。 2、消息队列 消息队列&#xff08;Message Queue&#xff09;是一种应用间的通信方式&#…

力扣题:字符串的反转-11.23

力扣题-11.23 [力扣刷题攻略] Re&#xff1a;从零开始的力扣刷题生活 力扣题1&#xff1a;557. 反转字符串中的单词 III 解题思想&#xff1a;先读取单词&#xff0c;然后将单词进行翻转即可 class Solution(object):def reverseWords(self, s):""":type s…

C语言-指针_02

指针-02 1. 指针的指针 概念&#xff1a;指针变量中存储的是指针的地址&#xff0c;又名 二维指针 语法&#xff1a; 数据类型 **p;示例&#xff1a; #include <stdio.h> int main(int argc, char const *argv[]) {int num 10;int *p1 &num;int **p2 &p1…

win11 无法登录微软账户 终极解决方案

背景&#xff1a;win11突然无法登录微软账户&#xff0c;office无法激活&#xff0c;Edge里的微软账户也无法登录&#xff0c;反馈中心也无法打开等&#xff0c;有网络&#xff0c;浏览器可以访问微软并进行登录。 试过网上的网络配置&#xff08;SSL及TLS协议勾选&#xff09…

论文编写软件latex安装教程

目录 1.下载安装包2.安装texlive 本人系统为windows&#xff0c;本教程基于windows系统&#xff0c;如果是其它系统请参考对应教程&#xff0c;注意选择对应系统的安装包&#xff01; 1.下载安装包 有三种集成环境安装包 texlive 是主流的环境&#xff0c;集成了较多的包&…

k8s(三): 基本概念-ReplicaSet与Deployment

PeplicaSet ReplicaSet 的目的是维护一组在任何时候都处于运行状态的 Pod 副本的稳定集合&#xff0c;通常用来保证给定数量的、完全相同的 Pod 的可用性。 最佳实践 Deployment 是一个可以拥有 ReplicaSet 并使用声明式方式在服务器端完成对 Pod 滚动更新的对象。 尽管 Rep…

华为杯研究生数学建模优秀参考论文(优秀论文参考2004-2022年)

一、背景介绍 中国研究生数学建模竞赛是一项面向在校研究生进行数学建模应用研究的学术竞赛活动&#xff0c;是广大在校研究生提高建立数学模型和运用互联网信息技术解决实际问题能力&#xff0c;培养科研创新精神和团队合作意识的大平台&#xff0c;大赛赞助单位为华为技术有限…

<JavaEE> synchronized关键字和锁机制 -- 锁的特点、锁的使用、锁竞争和死锁、死锁的解决方法

目录 一、synchronized 关键字简介 二、synchronized 的特点 -- 互斥 三、synchronized 的特点 -- 可重入 四、synchronized 的使用示例 4.1 修饰代码块 - 锁任意实例 4.2 修饰代码块 - 锁当前实例 4.3 修饰普通方法 - 锁方法所在实例 4.4 修饰代码块 - 锁指定类对象 …