C++类和对象(六):初始化列表

再谈构造函数

初始化列表

问题描述:虽然之前调用构造函数后,对象中的成员变量已经有了初始值,但是这仍然不能称之为对对象中成员变量的初始化,只能叫做赋初值,因为成员变量只能被初始化一次,而之前的构造函数内可以进行多次“初始化”

基本概念:初始化列表是每个成员变量定义初始化的位置

格式: 

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、在初始化列表中自定义类型的成员变量在初始化时默认调用它们的默认构造函数(即使在原内容中并没有明确的写出要初始化该自定义类型的成员变量,如果没有默认构造函数就会报错)

#include <iostream>
using namespace std;

class B
{
public:
    //全缺省的默认构造函数
	B(int a = 1)//参数的个数最好和
		:_a(a)
	{
		cout << "B(int a)" << endl;
	}
private:
	int _a;
};

class A
{
public:
	A(int year, int month, int day, int& x)
		: _year(year)
		, _month(month)
		, _day(day)
		, _n(1)
		, _ref(x)
        , _aa(1)
	{
	}

private:
	//声明
	int _year;
	int _month;
	int _day;

	//必须初始化
	const int _n;
	int& _ref;
	B _aa;
};

int main()
{
	int x = 10;
	A d1(2024, 1, 31, x);

	return 0;
}

调试过程: 20240310_233253-CSDN直播

如果没有默认构造就,可以直接显式调用(在初始化列表中给初始化参数):

	A(int year, int month, int day, int& x)
		: _year(year)
		, _month(month)
		, _day(day)
		, _n(1)
		, _ref(x)
        , _aa(1)
	{
	}

调试过程:20240310_234732-CSDN直播

如果有默认构造而且初始化列表中也有初始化,那么就按照初始化列表中给的参数来:

#include <iostream>
using namespace std;

class B
{
public:
	B(int a = 1)
		:_a(a)
	{
		cout << "B(int a)" << endl;
		cout << a << endl;
	}
private:
	int _a;
};


class A
{
public:
	A(int year, int month, int day, int& x)
		: _year(year)
		, _month(month)
		, _day(day)
		, _n(1)
		, _ref(x)
		, _aa(10)
	{
	}

private:
	//声明
	int _year;
	int _month;
	int _day;

	//必须初始化
	const int _n;
	int& _ref;
	B _aa;
};

int main()
{
	int x = 10;
	A d1(2024, 1, 31, x);

	return 0;
}

 

3、 引用成员变量、const成员变量、自定义类型成员变量(且该类没有默认构造函数时)必须放在初始化列表中进行初始化

#include <iostream>
using namespace std;

class B
{
public:
	B(int a, int b)//参数的个数应该和传入的参数个数相同(_aa(1,2)),即使不用
		:_a(a)
		,_b(b)
	{
		cout << "B(int a,int b)" << endl;
		cout << a << endl;
		cout << b << endl;
	}
private:
	int _a;
	int _b;
};

class A
{
public:
	A(int year, int month, int day, int& x)
		: _year(year)
		, _month(month)
		, _day(day)
		, _n(1)
		, _ref(x)
		, _aa(1, 2)
	{
	}

private:
	//声明
	int _year;
	int _month;
	int _day;

	//必须初始化
	const int _n;
	int& _ref;
	B _aa;
};

int main()
{
	int x = 10;
	A d1(2024, 1, 31, x);

	return 0;
}

4、一个成员变量只能在初始化列表中出现一次 

5、缺省值是给初始化列表用的(在初始化列表中没有给初始化值成员变量才会用缺省值)

6、成员变量在类中的声明次序就是它在初始化列表中的初始化顺序,与初始化列表中的次序无关

7、初始化列表与结构体要(可以)配合使用

#include <iostream>
using namespace std;

class B
{
public:
	B(int a, int b)//参数的个数最好和
		:_a(a)
		,_b(b)
	{
		cout << "B(int a,int b)" << endl;
		cout << a << endl;
		cout << b << endl;
	}
private:
	int _a;
	int _b;
};

class A
{
public:
	A(int year, int month, int day, int& x)
		: _year(year)
		, _month(month)
		, _day(day)
		, _n(1)
		, _ref(x)
		, _aa(1, 2)
		,_p((int*)malloc(sizeof(4)))
	{
		if (_p == nullptr)
		{
			perror("malloc fail");
		}
	}

private:
	//声明
	int _year;
	int _month;
	int _day;

	//必须初始化
	const int _n;
	int& _ref;
	B _aa;

	int* _p;
};

int main()
{
	int x = 10;
	A d1(2024, 1, 31, x);

	return 0;
}

8、 先进行初始化队列中的初始化后进行函数体中内容(初始化或者其它内容)

9、

static成员

友元

内部类

匿名对象

拷贝对象时的一些编译器优化

再次理解封装

~over~

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

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

相关文章

Java 基于微信小程序的快递柜小程序

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

P8680 [蓝桥杯 2019 省 B] 特别数的和:做题笔记

目录 思路 代码 题目链接&#xff1a; P8680 [蓝桥杯 2019 省 B] 特别数的和 思路 最开始我思路主要是从数字转字符串上想的。因为我们需要判断每一位是否是特殊数&#xff0c;字符串很容易做到这一点&#xff0c;只是在数字相加这一步不好实现。 需要用到字符串与数字的…

新IDEA电脑环境设置

1.设置UTF-8 2.Maven 3.JRE选对

FPGA - 科学设计复位信号(XILINX)

1&#xff0c;同步复位与异步复位 简单来说&#xff1a;复位信号与时钟同步&#xff0c;称之为同步复位。 复位信号与时钟不同步&#xff0c;称之为异步复位。 2、xilinx 的复位策略 ① 同步高复位 ② 计数器和状态机必须复位 ③ 能不使用复位尽量不使用复位&#xff0c;比如中…

使用Spring的AOP

使用Spring的AOP 一、AOP 的常用注解1.切面类Aspect2.Pointcut3.前置通知Before4.后置通知AfterReturning5.环绕通知Around6.异常通知AfterThrowing7.最终通知After8.切面顺序Order9.启用自动代理EnableAspectJAutoProxy 二、AOP注解方式开发三、AOP 全注解开发四、基于XML配置…

java中使用rabbitmq

文章目录 前言一、引入和配置1.引入2.配置 二、使用1.队列2.发布/订阅2.1 fanout(广播)2.2 direct(Routing/路由)2.3 Topics(主题)2.4 Headers 总结 前言 mq常用于业务解耦、流量削峰和异步通信,rabbitmq是使用范围较广,比较稳定的一款开源产品,接下来我们使用springboot的sta…

资料下载-嵌入式 Linux 入门

学习的第一步是去下载资料。 1. 有哪些资料 所有资料分 4 类&#xff1a; ① 开发板配套资料(原理图、虚拟机的映像文件、烧写工具等)&#xff0c;放在百度网盘 ② 录制视频过程中编写的文档、源码、图片&#xff0c;放在 GIT 仓库 ③ u-boot、linux 内核、buildroot 等比较大…

机器学习评价指标(分类、目标检测)

https://zhuanlan.zhihu.com/p/364253497https://zhuanlan.zhihu.com/p/46714763https://blog.csdn.net/u013250861/article/details/123029585 1.1 混淆矩阵 在介绍评价指标之前&#xff0c;我们首先要介绍一下混淆矩阵&#xff08;confusion matrix&#xff09;。混淆矩阵…

C++的类与对象(五):赋值运算符重载与日期类的实现

目录 比较两个日期对象 运算符重载 赋值运算符重载 连续赋值 日期类的实现 Date.h文件 Date.cpp文件 Test.cpp文件 const成员 取地址及const取地址操作符重载 比较两个日期对象 问题描述&#xff1a;内置类型可直接用运算符比较&#xff0c;自定义类型的对象是多个…

《日期类》的模拟实现

目录 前言&#xff1a; 头文件类与函数的定义Date.h 实现函数的Date.cpp 测试Test.cpp 运行结果&#xff1a; 前言&#xff1a; 我们在前面的两章初步学习认识了《类与对象》的概念&#xff0c;接下来我们将实现一个日期类&#xff0c;是我们的知识储备更加牢固。 头文件…

角蜥优化算法 (Horned Lizard Optimization Algorithm ,HLOA)求解无人机路径优化

一、无人机路径规划模型介绍 无人机三维路径规划是指在三维空间中为无人机规划一条合理的飞行路径,使其能够安全、高效地完成任务。路径规划是无人机自主飞行的关键技术之一,它可以通过算法和模型来确定无人机的航迹,以避开障碍物、优化飞行时间和节省能量消耗。 二、算法介…

【JAVA】CSS3:3D、过渡、动画、布局、伸缩盒

1 3D变换 1.1 3D空间与景深 /* 开启3D空间,父元素必须开启 */transform-style: preserve-3d;/* 设置景深&#xff08;你与z0平面的距离 */perspective:50px; 1.2 透视点位置 透视点位置&#xff1a;观察者位置 /* 100px越大&#xff0c;越感觉自己边向右走并看&#xff0c;…

K8S之实现业务的蓝绿部署

如何实现蓝绿部署 什么是蓝绿部署&#xff1f;蓝绿部署的优势和缺点优点缺点 通过k8s实现线上业务的蓝绿部署 什么是蓝绿部署&#xff1f; 部署两套系统&#xff1a;一套是正在提供服务系统&#xff0c;标记为 “绿色” &#xff1b;另一套是准备发布的系统&#xff0c;标记为…

LInux系统架构----Apache与Nginx动静分离

LInux系统架构----Apache与Nginx动静分离 一.动静分离概述 Nginx的静态处理能力比较强&#xff0c;但是动态处理能力不足&#xff0c;因此在企业中常采用动静分离技术在LNMP架构中&#xff0c;静态页面交给Nginx处理&#xff0c;动态页面交给PHP-FPM模块处理。在动静分离技术…

【软件测试面试】银行项目测试面试题+答案(二)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 面试题&#xff1…

HTTP/2的三大改进:头部压缩、多路复用和服务器推送

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

CSS 居中对齐 (水平居中 )

水平居中 1.文本居中对齐 内联元素&#xff08;给容器添加样式&#xff09; 限制条件&#xff1a;仅用于内联元素 display:inline 和 display: inline-block; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><…

[c++] 查表 —— 策略模式和职责链模式的核心

查表法在工厂模式、策略模式以及职责链模式中都有使用。以工厂模式为例&#xff0c;表中存储的数据&#xff0c;key 是商品的类型&#xff0c;value 是生产这个商品的工厂。在生产商品的时候&#xff0c;直接根据商品类型从表中获得商品对应的工厂&#xff0c;然后通过工厂生产…

多维时序 | Matlab实现BiTCN双向时间卷积神经网络多变量时间序列预测

多维时序 | Matlab实现BiTCN双向时间卷积神经网络多变量时间序列预测 目录 多维时序 | Matlab实现BiTCN双向时间卷积神经网络多变量时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.Matlab实现BiTCN双向时间卷积神经网络多变量时间序列预测&#xff08;完整…

HTML概念

文章目录 1. HTML 概念1.1. 简介1.2. 思想1.3. 特点1.4. 语法1.4.1. 标签1.4.2. 属性1.4.3. 标签体1.4.4. 注释 2. HTML 实体2.1. 练习 3. HTML 结构3.1. <!DOCTYPE html>声明3.2. html根标签 4. 补充4.1. 管理文件4.2. 配置 VsCode4.2. 配置 VsCode 1. HTML 概念 1.1. 简…
最新文章