(构造函数的补充1)初始化列表

news2024/10/6 18:22:03

tips

  1. 在引用与指针传参的时候,都涉及到权限的放大缩小问题,都需要特别去注意一下。关于引用的权限放大缩小以及判断,在我之前的博客里面就有写过;对于指针的权限放大缩小问题,就看星号前面是否修饰了const。他们两个的权限放大缩小,问题都在于:当进行引用与指针传参的时候,权限只能够平移或缩小,而不能够进行放大
  2. 只要但凡是个自定义类型,运用运算符的时候,需要对运算符进行重载,因为自定义类型是我们自己定义的,电脑里面的运算符它只知道内置类型怎么去处理,对于我们自己定义的类型他是不知道的,需要我们自己去重载实现
  3. 默认成员函数的运算符重载都不能给他重载成全局函数,因为如果你在类当中没有实现的话,编译器会自己生成一个,这样子的话就会与你全局定义的那个运算符重载会发生冲突

初始化列表的引入与介绍

  1. 当你去创建一个实例化对象的时候,与此同时也就相当于意味着去创建了这个实例化对象当中的各种各样的成员变量,这些成员变量有内置类型、自定义类型的,***那些自定义类型的成员变量也相当于是某个类的实例化对象,可以把它理解成麻雀虽小,五脏俱全。***那么对于那个自定义类型的成员变量一旦创建,根据一语双关的原则,也就必须得去调用属于该类的一个构造函数。根据语法格式来看的话,那些自定义类型成员变量它所调用的构造函数是一个无参的默认构造函数不管是编译器自己生成的,还是你自己写的一个构造函数,在没有引入初始化列表这个概念之前,都是没有办法去调用自定义类型变量麾下的有参的构造函数。
  2. 我们之前知道在创建对象的时候,编译器会调用构造函数,给对象中每一个成员变量一个合适的初始值,虽然在上述构造函数调用之后,对象当中已经有了一个初始值,但是这个绝对不能够称为对象中成员变量的初始化。首先必须得知道初始化与赋初值的区别,初始化是只能够初始化一次,你见过哪里有初始化多次的?在这个构造函数体内,你可以多次进行赋值,那你哪里还有资格称你自己是初始化?所以在构造函数体内被称为赋初值,就是给个初始值,这个是正确的,但绝对不能够投换概念成初始化。在没有引入成员列表之前,之前的那些构造函数的操作称为类实例化对象的成员变量当中去给一个初始值,但这个初始值并不能够称之为初始化,因为初始化的话它的次数只能够是一次,然后你这边的话,它可以进行多次的一个赋值。
    在这里插入图片描述
  3. 有时候这个类的实例化对象当中就有那么一些极其特殊的成员变量(比方说引用与const修饰的常量),必须在定义的时候就得初始化,非初始化不可。这时候,之前的这些构造函数就不能够满足要求,之前的那些构造函数体内被称为赋初值而不是初始化。然后就需要引入初始化列表这个概念,初始化列表他也是在构造函数里面,他就是专门用来为那些成员变量进行初始化的一个地方。在这里插入图片描述
  4. 引入了初始化列表这个概念之后,与此同时就也可以去调用自定义类型成员变量的非默认构造函数了。
  5. 上面是引入,接下来介绍:初始化列表:以一个冒号开始,接着是一个以逗号分隔的数据成员列表,每个"成员变量"后面跟一个放在括
    号中的初始值或表达式。
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. 有了初始化列表的话,有绝大部分成员变量的赋初值这些的话原先都是在构造函数体内完成,现在的话都可以给他放到初始化列表那边去进行一个初始化,效果都是一样的。
  3. 但是初始化列表的新的加入并不能够完全取代函数体内赋值,总有那么一些工作并不适合在初始化列表当中去进行初始化,还是会需要用到函数体内复制,就是说构造函数的函数体内有时候还是有作用的,举几个简单的例子,比方说:malloc开辟空间后指针的检查,以及二维数组的动态开辟等等之类的
  4. 如下是函数体内赋初值
class Stack
{
public:
	Stack(int size = 0, int capacity = 10)
	{
		_size = size;
		_capacity = capacity;
		_a = (int*)malloc(sizeof(int) * capacity);
		if (_a == nullptr)
		{
			perror("malloc failed");
			return;
		}
	}
private:
	int* _a;
	int _size;
	int _capacity;
};
  1. 如下是构造函数里面用初始化列表
class Stack
{
public:
	Stack(int size = 0, int capacity = 10)
		:_a((int*)malloc(sizeof(int)* capacity))
		,_size(size)
		, _capacity(capacity)
	{
		if (_a == nullptr)
		{
			perror("malloc failed");
			return;
		}
	}
private:
	int* _a;
	int _size;
	int _capacity;
};
  1. 如下:将初始化列表与函数体赋值两者结合到构造函数里面去实现二维数组的动态开辟
class array2
{
public:
	array2(int row = 10, int col = 10)
		: _row(row)
		, _col(col)
	{
		_a = (int**)malloc(sizeof(int*) * _row);
		if (_a == nullptr)
		{
			perror("malloc failed");
			return;
		}
		for (int i = 0; i < _row; i++)
		{
			_a[i] = (int*)malloc(sizeof(int) * _col);
			if (_a[i] == nullptr)
			{
				perror("malloc failed");
				return;
			}
		}
	}
	void input()
	{
		for (int i = 0; i < _row; i++)
		{
			for (int j = 0; j < _col; j++)
			{
				*(_a[i] + j) = j;
			}
		}
	}
	void output()
	{
		for (int i = 0; i < _row; i++)
		{
			for (int j = 0; j < _col; j++)
			{
				cout << *(_a[i] + j) << " ";
			}
			cout << endl;
		}
	}
	~array2()
	{
		for (int i = 0; i < _row; i++)
		{
			free(_a[i]);
		}
		free(_a);
	}
private:
	int** _a;
	int _row;
	int _col;
};
int main()
{
	array2 a(10,10);
	a.input();
	a.output();
	return 0;
}

初始化列表的注意点

  1. 在这里插入图片描述
  2. 初始化列表这边有个极其巨大的坑:成员变量在类当中声明的次序就决定了在初始化列表当中的初始化顺序,这个与在初始化列表当中的语句前后次序无关,但是在构造函数体内的话,就没有这个问题,还是按你写的函数语句依次执行,如下面这个代码执行结果为1, 随机值
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();
}
  1. 因此在初始化列表当中,在类当中,成员变量声明的顺序与在初始化列表当中定义的顺序要保持一致
  2. 尽量使用初始化列表初始化,因为不管你是否使用初始化列表,对于自定义类型成员变量,一定会先使用初始化列表初始化。

初始化列表的总结

在这里插入图片描述
在这里插入图片描述

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

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

相关文章

详解c++---优先级队列和仿函数

目录标题 什么是仿函数如何定义一个仿函数什么是优先级队列优先级队列的使用模拟实现priority_queue准备工作top函数的实现size函数的实现empty函数的实现adjustup函数的实现push函数的实现pop函数的实现adjustdown函数的实现构造函数的实现 什么是仿函数 首先仿函数就是一个类…

若依任意文件下载(CVE-2023-27025)

若依它就是一个开源项目,任何公司的各种大的项目必然需要一个后台权限管理系统,这是必然的,但是如果不想投入太多人力物力去开发,又恰好有现成且比较好用的别人已经完成的项目直接供我们来使用 。 1、使用、减少工作量 2、学习优秀的开源项目底层的编程思想,设计思路,提…

UDP通讯(服务器/客户端)

前言&#xff1a;UDP通讯实现比较简单&#xff0c;单某些情况下也会使用&#xff0c;建议先看一下说明&#xff0c;然后运行代码感受一下。 UDP服务器 传输层主要应用的协议模型有两种&#xff0c;一种是TCP协议&#xff0c;另外一种则是UDP协议。TCP协议在网络通信中占主导地…

Golang-如何判断一个 interface{} 的值是否为 nil ?

引用 起初我会下意识的回答&#xff0c;直接 v nil 进行判断不就好了吗&#xff1f; 然后翻阅了很多资料终于大致搞定里面的道道. 例子 请看下面这段代码&#xff0c;可以先猜测一下输出的结果。 package mainimport ("fmt" )func main() {var a *string nilv…

网安笔记 08 key management

Key Management —— 不考 网络加密方法 1.1 链路加密 特点&#xff1a; 两个相邻点之间数据进行加密保护 不同节点对密码机和Key不一定同中间节点上&#xff0c;先解密后加密报文报头可一起加密节点内部&#xff0c;消息以明文存在密钥分配困难保密及需求数量大 缺点&…

day36_jdbc

今日内容 上课同步视频:CuteN饕餮的个人空间_哔哩哔哩_bilibili 同步笔记沐沐霸的博客_CSDN博客-Java2301 零、 复习昨日 一、JDBC 二、登录 三、ORM 零、 复习昨日 sql语言&#xff1a;DDL DML DQL DCL create table 表名(id int primary key auto_increment,sname varchar(2…

【SAP Abap】X-DOC:SMW0 - Excel 导入模板的上传和下载

X-DOC&#xff1a;SMW0 - Excel 导入模板的上传和下载 1、实现效果2、模板上传3、下载功能代码 做批导程序&#xff0c;离不开 Excel 导入模板&#xff0c;为了方便用户&#xff0c;一般会将模板文档整合到导入功能的界面上&#xff0c;方便用户获取模板。 1、实现效果 2、模板…

两个form表单的数据存入同一个数据库表,使用使用json操作

项目场景&#xff1a; 两个form表单的数据存入同一个数据库表 问题描述 1.两个from表单数据一起传到后端但是数据解析和xml文件的sql获取不到报错 2.数据接受到了但是提示数据类型不兼容 3.使用RequestBody注解报错Content type application/x-www-form-urlencoded;charsetUT…

深入解析linux IO Block layer

早期的 Block 框架是单队列&#xff08;single-queue&#xff09;架构&#xff0c;适用于“硬件单队列”的存储设备&#xff08;比如机械磁盘&#xff09;&#xff0c;随着存储器件技术的发展&#xff0c;支持“硬件多队列”的存储器件越来越常见&#xff08;比如 NVMe SSD&…

makefile 变量的替换,嵌套引用,命令行变量

文章目录 前言一、变量替换&#xff1a;1. 变量值的替换。2. 变量的模式替换。3. 规则中的模式替换。 二、变量的嵌套使用三、命令行变量四、override ,define 关键字总结 前言 一、变量替换&#xff1a; 1. 变量值的替换。 使用 指定的字符&#xff08;串&#xff09;替换变…

ctfshow web入门 ssrf web351-355

1.web351 尝试访问本机的flag.php payload: urlhttp://localhost/flag.php urlhttp://127.0.0.1/flag.php2.web352 必须要用http或https&#xff0c;ip没有过滤因为匹配时没加变量&#xff0c;恒为真 payload: urlhttp://127.0.0.1/flag.php urlhttp://localhost/flag.php3.…

智能美妆镜兴起,如何升级更精细、智能的化妆体验!

经常化妆的小姐姐&#xff0c;会发现化妆除了要有好皮肤、一堆化妆品之外&#xff0c;化妆镜的作用也尤其重要&#xff01;爱拍照的小姐姐们都知道&#xff0c;自拍的效果好不好&#xff0c;和背景、灯光有着很大的关系&#xff0c;其中灯光的冷调或者暖调&#xff0c;也是影响…

Linux网络——Shell编程之数组

Linux网络——Shell编程之数组 一、概念二、数组的定义三、Shell数组操作1. 获取数组的所有元素的列表2. 获取数组的所有元素下标3.取数组的元素个数4. 获取数组的某个元素的值5.删除数组某个元素6.删除数组7.数组切片8.数组字符替换9.数组追加元素 四、数组在函数的传参 一、概…

阿里云Intel(R) Xeon(R) Platinum处理器2.5 GHz主频

阿里云服务器CPU处理器Intel(R) Xeon(R) Platinum&#xff0c;2.5 GHz主频&#xff0c;3.2 GHz睿频&#xff0c;测试的云服务器ECS为通用算力型u1实例ecs.u1-c1m2.large&#xff0c;如下图&#xff1a; 阿里云服务器CPU处理器Intel(R) Xeon(R) Platinum 目前使用这款CPU处理器…

c++类和对象重要巩固练习-------日期类对象

这是对于类和对象的练习篇&#xff0c;用c来模拟完成日期计算器。 这其中需要我们完成&#xff1a; 日期 - 天数后 得到的新日期 日期 - 日期 得到相差的天数比较日期的大小等 .....具体如下头文件类中的成员函数 #pragma once #include<iostream> using namespace std…

【UE】简单实现屏幕UI定位

【UE】简单实现屏幕UI定位三维坐标方法 实现效果 屏幕空间定位 场景空间定位 一般实现兴趣点&#xff08;POI&#xff09;有两种实现方法&#xff0c;场景空间UI定位和屏幕空间UI定位。 场景空间定位&#xff1a;UI类似实例模型&#xff0c;位置和尺寸是相对于场景不变。大多…

Laravel 知识整合 1 路由

Laravel是一种基于php的MVC web开发框架 php artisan make:controller NAME//创建一个名字为name的controller路由&#xff1a;routes/web.php Route::get(/students,StudentControllerindex); 控制器&#xff1a;app/HTTP/Controllers&#xff08;可以直接用命令行生成&…

SSM框架学习-依赖注入、自动装配、暴力反射

1. 依赖注入 1.1 引用类型 注入引用类型 一种是默认按照类型装配 一种是如果有相同类型的bean采用按bean名称装配 但是在写的过程中Qualifier前面必须写上Autowired 也就是必须依赖Autowired //Autowired&#xff1a;注入引用类型&#xff0c;自动装配模式&#xff0c;默认按类…

一场面试下来,狂飙 Framework底层原理

近期有位Android 开发的朋友在吐槽说&#xff1a;现在的招聘信息网站是假的吧&#xff0c;我都怀疑一些公司的人事在冲他们的KPI&#xff0c;三个月了&#xff0c;简历投了上百份&#xff0c;结果收到回应的才个位数&#xff0c;去面试还一套Framework底层原理面试题狂炸…… 面…

178_技巧_Power BI 动态排名多项展示

178_技巧_Power BI 动态排名多项展示 一、背景 在 Power BI 中做排名矩阵时&#xff0c;我们经常遇到同一维度下&#xff0c;多项展示排名的问题。类似这样的排名矩阵&#xff0c;排名的名次不会太多&#xff0c;但是同一维度下会有多项同时展示排名&#xff0c;并且还要满足…