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

news2025/2/25 13:36:52

首先我们来谈一下初始化列表,它其实是对于我们前边构造函数体内初始化的一种补充,换一种说法,它以后才是我们构造函数的主体部分。
我们先考虑一个问题,就是一个类里面有用引用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修饰,不管是变量还是函数都像一个专属这个类的全局的一样

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

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

相关文章

已解决AttributeError: module ‘gradio‘ has no attribute ‘outputs‘

问题描述 Traceback (most recent call last): File "/media/visionx/monica/project/ResShift/app.py", line 118, in <module> gr.outputs.File(label"Download the output")AttributeError: module gradio has no attribute outputs 解决办…

Java高级技术-单元测试

单元测试 Junit单元测试框架 Junit单元测试-快速入门 方法类 测试类 Junit框架的基本注解

同旺科技 USB TO SPI / I2C --- 调试W5500_Ping测试

所需设备&#xff1a; 内附链接 1、USB转SPI_I2C适配器(专业版); 首先&#xff0c;连接W5500模块与同旺科技USB TO SPI / I2C适配器&#xff0c;如下图&#xff1a; 设置寄存器&#xff1a; SHAR&#xff08;源MAC地址寄存器&#xff09;&#xff0c;该寄存器用来设置源MAC…

中国人工智能

随着科技的飞速发展&#xff0c;人工智能&#xff08;AI&#xff09;作为一项前沿技术在各个领域展现出了强大的潜力。本文将探讨中国人工智能的历史、现状&#xff0c;并展望其未来发展。 人工智能的起源与历史 人工智能的概念最早诞生于1956年的美国达特茅斯学院的夏季研讨会…

231202 刷题日报

周四周五&#xff0c;边值班边扯皮&#xff0c;没有刷题。。 今天主要是做了: 1. 稀疏矩阵压缩&#xff0c;十字链表法 2. 快速排序 3.349. 两个数组的交集​​​​​ 4. 174. 地下城游戏 要注意溢出问题&#xff01;

KNN实战-图像识别

数据说明 是在循环0-9的数字一直循环500次所得到的数据&#xff0c;然后以手写照片的形式存在 识别的步骤 加载数据构建目标值构建模型参数调优可视化展示 加载数据 import numpy as np import matplotlib.pyplot as plt # 记载数据 data np.load(./digit.npy) data构建目…

【HDFS】调试慢节点pipiline ack信息

Client - DN1 - DN2 - DN3 DN3 send ack:[0][d3]。 DN2 send ack: [从dn2入队到收到dn3的ack耗时,0] [d2,d3]。 DN1 send ack: [pkt从dn1入队到收到dn2的ack耗时,pkt从dn2入队到收到dn3的ack耗时,0] [d1,d2,d3]。 Client receive: 就是DN1发送过来数据。 客户端收到的第一个…

000FreeCAD源码学习--MainGui.cpp

目录 1 MainGui.cpp源代码 2 int main()函数分析 3 编译运行截图 FreeCADMain项目下的MainGui.cpp 1 MainGui.cpp源代码 int main( int argc, char ** argv ) { #if defined (FC_OS_LINUX) || defined(FC_OS_BSD)setlocale(LC_ALL, ""); // use native environm…

【C++干货铺】继承 | 多继承 | 虚继承

个人主页点击直达&#xff1a;小白不是程序媛 C系列专栏&#xff1a;C干货铺 代码仓库&#xff1a;Gitee 目录 继承的概念及定义 继承的概念 继承的定义 继承基类成员访问方式的变化 基类和派生类的赋值转化 继承中的作用域 派生类的默认成员函数 构造函数 拷贝构造…

判断是否有环形链表

问题描述&#xff1a; 给定一个链表&#xff0c;判断链表中是否有环。 如果链表中有某个节点&#xff0c;可以通过连续跟踪next指针再次到达&#xff0c;则链表中存在环。为了表示给定链表中的环&#xff0c;我们使用整数pos来表示链表尾连接到链表中的位置&#xff08;索引从0…

抖音视频如何无水印保存?抖音视频无水印保存教程

抖音视频如何无水印保存&#xff1f;当下短视频盛行时代&#xff0c;抖音作为当下主流短视频平台之一&#xff0c;每天都有数以亿计的用户在抖音上分享自己的创作&#xff0c;然后当我们遇到感兴趣的视频&#xff0c;下载保存后会发现带有水印&#xff0c;那么抖音视频如何无水…

scrapy介绍,并创建第一个项目

一、scrapy简介 scrapy的概念 Scrapy是一个Python编写的开源网络爬虫框架。它是一个被设计用于爬取网络数据、提取结构性数据的框架。 Scrapy 使用了Twisted异步网络框架&#xff0c;可以加快我们的下载速度。 Scrapy文档地址&#xff1a;http://scrapy-chs.readthedocs.io/z…

LangChain 17 LangSmith调试、测试、评估和监视基于任何LLM框架构建的链和智能代理

LangChain系列文章 LangChain 实现给动物取名字&#xff0c;LangChain 2模块化prompt template并用streamlit生成网站 实现给动物取名字LangChain 3使用Agent访问Wikipedia和llm-math计算狗的平均年龄LangChain 4用向量数据库Faiss存储&#xff0c;读取YouTube的视频文本搜索I…

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;但实质上与…

剑指 Offer(第2版)面试题 14:剪绳子

剑指 Offer&#xff08;第2版&#xff09;面试题 14&#xff1a;剪绳子 剑指 Offer&#xff08;第2版&#xff09;面试题 14&#xff1a;剪绳子解法1&#xff1a;动态规划解法2&#xff1a;数学 剑指 Offer&#xff08;第2版&#xff09;面试题 14&#xff1a;剪绳子 题目来源…

隐形内嵌!触想智能发布全新B款内嵌式工控一体机及内嵌式工业显示器

近日&#xff0c;触想智能发布全新B款内嵌式工控系列TPC-19.该系列可支持显示器和一体机等多种品类、多级配置的灵活选购。标志性的2.5mm矮阶窄边面板设计&#xff0c;适配隐形内嵌式安装&#xff0c;专为机柜类设备应用打造&#xff0c;以高契合的物理结构&#xff0c;带动稳定…

Mybatis 操作续集2(结合上文)

Mybatis 是一个持久层框架,用于简化数据库的操作,和Spring 没有任何关系,我们现在能使用它是因为 Spring Boot 把Mybatis 的依赖给引入进来了,在 pom.xml 里面 Mybatis 如何进行重命名? 看最后两行代码,这样就能重命名了 package com.example.mybatisdemo.mapper;import com…

Leetcode144. 二叉树的前序遍历-C语言

文章目录 题目介绍题目分析解题思路1.创建一个数组来储存二叉树节点的值2.根据二叉树的大小来开辟数组的大小3.边前序遍历边向创建的数组中存入二叉树节点的值 完整代码 题目介绍 题目分析 题目要求我们输出二叉树按前序遍历排列的每个节点的值。 解题思路 1.创建一个数组来…

详解SpringAop开发过程中的坑

&#x1f609;&#x1f609; 学习交流群&#xff1a; ✅✅1&#xff1a;这是孙哥suns给大家的福利&#xff01; ✨✨2&#xff1a;我们免费分享Netty、Dubbo、k8s、Mybatis、Spring...应用和源码级别的视频资料 &#x1f96d;&#x1f96d;3&#xff1a;QQ群&#xff1a;583783…

在 ArcGIS 软件中添加左斜宋体(东体)的方法与步骤

河流水系在作图时一般设置为左斜宋体&#xff08;东体&#xff09;、蓝色&#xff0c;比如黄河、青海湖等&#xff0c;如下图所示&#xff1a; 标准地图水系注记 下面讲解如何在 ArcGIS 软件中添加左斜宋体&#xff08;东体&#xff09;&#xff0c;首先需要下载左斜宋体&#…