C++--类和对象(三)

news2024/11/24 21:07:20

本篇主要是填补前两篇类和对象中的小知识点

第一篇:C++--类和对象(一)-CSDN博客

第二篇:C++--类和对象(二)-CSDN博客

目录

1.初始化列表

2.友元(friend)

3.内部类


1.初始化列表

在之前实现构造函数的时候,我都是在函数体内对成员变量初始化,但构造函数还有一种初始化方式,就是初始化列表,初始化列表的使用方式是以一个冒号开始通过逗号分隔数据每一个成员变量的后跟着一个括号里面放初始值或表达式

1.每个成员变量在初始化列表中只能出现一次,初始化列表可以认为式每个成员变量定义初始化的地方

2.引用成员变量,const成员变量,和没有默认构造的类类型变量(需要进行传参),必须在初始化列表上进行初始化,否则编译报错

3.C++11支持在成员声明的地方给缺省值,这个缺省值主要是给没有显示在初始化列表中的成员使用的。推荐对于引用成员变量,const成员变量,和没有默认构造的类类型变量在声明的地方写缺省值

4.尽量使用初始化列表初始化,因为不管怎么样,成员变量都会走初始化列表,如果在声明的地方写了缺省值,那么初始化列表时就会使用缺省值初始化,对于既没有在声明写缺省值也没有在初始化列表显示的成员,内置类型取决于编译器,它有可能不作为;自定义类型成员会调用这个成员类型的默认构造函数,没有那就报错

5.初始化列表中的成员变量按照类中声明的顺序一致,在初始化列表中的先后顺序不取决于列表中的顺序

class stack
{
public:
	stack(int n = 4)
		:_acc (new int[n])//当作malloc就行
		, _top(0)
		,_capacity(n)
	{}
private:
	int* _acc=nullptr;    //缺省值
	size_t _top=0;
	size_t _capacity=0;
};

虽说尽量使用列表初始化,但还是要分情况,请自行判断是使用函数体好还是初始化列表好 

2.友元(friend)

友元提供了一种突破类访问限定符封装的方式,友元分为友元函数和友元类,在函数声明或者类声明的前面加friend,并将友元声明放在一个类里面

1.友元修饰过的函数可以访问类的私有和保护成员,但它知识一个声明,他不是类的成员函数

2.友元函数可以在任意位置声明,它无视访问限定符

3.一个函数可以是多个类的友元函数

4.友元类中的成员函数都可以是另一个类的友元函数,都可以访问另一个类中的私有和保护成员

5.友元类是单向的,不具备交换性,如A类是B类的友元,但B类不是A类的友元

class A
{   //友元声明
	friend class B;        //将类B设为友元
public:
	A(int y = 1)
	{
		_y = y;
	}
private:
	int _y;
};

class B
{
public:
	B(int x = 0)
	{
		_x = x;
	}
	void print(const A& a)    //B内可以访问A的私有成员
	{
		cout <<"A:" << a._y << endl;
		cout << "B:" << _x << endl;
	}
	void print()              //函数重载
	{
		cout << "B:" << _x<<endl;   
	}
private:
	int _x;
};
int main()
{
	B b;
	A a;
	b.print(a);
	b.print();
	return 0;
}

运行结果:

注意:友元能够突破访问限定的功能,这在一定程度上破坏了封装,所以少量使用

3.内部类

类也支持嵌套,可以将一个类定义在另外一个类的内部,而这种类就叫内部类。内部类是一个独立的类,和定义在全局相比,它只会受到外部类和访问限定符的限制,所以外部类定义的对象中不包含内部类

1.内部类自动是外部类的友元类

2.内部类也是封装的一种,假设A类和B类关系紧密,且想把A类作为B类的专属,那么就可以考虑将A类放到privat(私有)/protected(保护)位置,这样A类就是B类专属

注意:内部类的使用比较容易出错所以较少使用,如果关系并不密切那还不如使用友元

class C
{
private:
	int _x = 0;
public:
	class D
	{
	public:
		void print(const C&c)
		{
			cout<<"内部类D;"<< c._x << endl;
			cout<<"外部类C:" << _y << endl;
		}
	private:
		int _y = 1;
	};
};
int main()
{
	C c;
	C::D d;
	d.print(c);
	return 0;
}

本章主要是填补前几章的知识,希望本篇能够帮助到你,感谢你的阅读

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

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

相关文章

uniapp 总结

uniapp的 发送请求的 responseType是没有 blob这个类型的&#xff0c; responseType: ‘arraybuffer’, uniapp 标准js和浏览器js的区别 downloadFile的原理作用

从零开始学习SLAM(五):极几何与极约束

文章参考计算机视觉life 前备知识 概念 几何关系&#xff1a; 上图中&#xff1a; 极平面&#xff08;Epipolar plane&#xff09;&#xff1a;点c0, c1, p三点确定的平面&#xff1b; 极点&#xff08;Epipoles&#xff09;&#xff1a; c0 c1 连线与两个平面的交点 基线&a…

SAP Parallel Accounting(平行分类账业务)配置及操作手册【适用于多国家会计准则】

1. 配置准备 1.1 理解平行账概念 平行账&#xff0c;也称为多分类账&#xff0c;是SAP系统中的一项功能&#xff0c;它允许企业按照不同的会计准则来维护各自的财务数据。这种设置特别适用于那些需要符合多种会计准则的跨国公司。通过平行账&#xff0c;企业可以在不同的分类…

单片机存储芯片 W25QXX、AT24C02

一、FLASH W25QXX (1) W25QXX芯片简介 W25Q128是华邦公司推出的一款SPI接口的NOR Flash芯片&#xff0c;其存储空间为128Mbit&#xff0c;相当于16M字节。W25Q128V芯片是串行闪存&#xff0c;可以通过标准/两线/四线SPI控制。W25Q128一次最多可编程256个字节。页面可以按扇区擦…

特斯拉算法,暴力递归尝试,汉诺塔问题

改进之后的算法 暴力递归就是尝试 汉诺塔问题 主函数 打印一个字符串的全部子序列&#xff0c;包括空字符串

【数据结构题集(c语言版)】内部排序算法比较 题解(起泡排序+直接插入排序+简单选择排序+快速排序+希尔排序+堆排序)

内部排序算法比较 问题描述 在教科书中,各种内部排序算法的时间复杂度分析结果只给出了算法执行时间的阶或大概执行时间。试通过随机数据比较各算法的关键字比较次数和关键字移动次数,以取得直观感受。 基本要求 对以下6种常用的内部排序算法进行比较:起泡排序、直接插入排…

SpringBoot依赖之Spring Data Redis 实现地理坐标(Geospatial)

Spring Boot 项目中使用 Spring Data Redis 实现地理坐标(Geospatial) 概念 Spring Data Redis (AccessDriver) 依赖名称: Spring Data Redis (AccessDriver)功能描述: Advanced and thread-safe Java Redis client for synchronous, asynchronous, and reactive usage. Sup…

JVM 有哪些垃圾回收器?

JVM 有哪些垃圾回收器&#xff1f; 图中展示了7种作用于不同分代的收集器&#xff0c;如果两个收集器之间存在连线&#xff0c;则说明它们可以搭配使用。虚拟机所处的区域则表示它是属于新生代还是老年代收集器。 新生代收集器&#xff08;全部的都是复制算法&#xff09;&…

使用 Charles 模拟手机弱网测试

在移动互联网时代&#xff0c;网络状况的不确定性给应用程序带来了挑战。尤其是在偏远地区或信号不佳的地方&#xff0c;用户的网络连接可能会变得不稳定。因此&#xff0c;对应用程序进行弱网测试变得尤为重要。Charles Proxy 是一款广泛使用的网络调试工具&#xff0c;它不仅…

分享小诗梦404炫酷单页面html5源码

源码介绍 分享小诗梦404炫酷单页面html5源码&#xff0c;小诗梦的一个很炫酷页面&#xff0c;感觉应该符合一些人的感觉&#xff01;可以用来做404页面。 源码下载 分享小诗梦404炫酷单页面html5源码

C++ | Leetcode C++题解之第363题矩形区域不超过K的最大数值和

题目&#xff1a; 题解&#xff1a; class Solution { public:int maxSumSubmatrix(vector<vector<int>> &matrix, int k) {int ans INT_MIN;int m matrix.size(), n matrix[0].size();for (int i 0; i < m; i) { // 枚举上边界vector<int> sum(…

SAP凭证分割【Document Splitting】

在SAP系统中&#xff0c;凭证分割&#xff08;Document Splitting&#xff09;是一种用于在财务会计模块中特别是总帐会计中进行更细粒度的财务报表分析的技术。通过凭证分割&#xff0c;可以按照不同的标准&#xff08;如成本中心、利润中心、公司代码等&#xff09;对会计凭证…

C语言 | Leetcode C语言题解之第363题矩形区域不超过K的最大数值和

题目&#xff1a; 题解&#xff1a; int maxSumSubmatrix(int** matrix, int matrixSize, int* matrixColSize, int k){int preSum[matrixSize][*matrixColSize];for(int i0; i<matrixSize; i){preSum[i][0] matrix[i][0];}for(int i0; i<matrixSize; i){for(int j1; j…

Funsound语音识别技术之 语音识别多路并发转写

免费语音识别转写&#xff08;优于讯飞&#xff09;&#xff1a;www.funsound.cn Funsound语音识别工具包&#xff1a;https://github.com/pika-online/Funsound/tree/main 1. 前言 本文主要介绍一种简单的多路语音识别转写部署方案&#xff0c;基于多线程开发实现后台同时转…

總結熱力學_2

個人近況 在考慮廷畢的選課情況&#xff0c;以及更改教資的科目三&#xff1a;比如由物理改為音樂 在看<<怪談直播間>>&#xff0c;顧毅的第五關太長了... <<詭舍>>不知道&#xff0c;三下鄉完了就没看了 參考: 陈曦<<热力学讲义>>ht…

甄选范文“论软件体系结构的演化”软考高级论文,系统架构设计师论文

论文真题 软件体系结构的演化是在构件开发过程中或软件开发完毕投入运行后,由于用户需求发生变化,就必须相应地修改原有软件体系结构,以满足新的变化了的软件需求的过程。体系结构的演化是一个复杂的、难以管理的问题。 请围绕“论软件体系结构的演化”论题,依次从以下三…

Array List集合的基本使用

数组&#xff1a;长度固定 集合&#xff1a;自动扩容 数组&#xff1a;可以存基本数据类型&#xff0c;可以存引用数据类型 集合&#xff1a;可以存引用数据类型&#xff0c;不可以存基本数据类型&#xff08;要换成对应的包装类&#xff09; package ArrayListDemo;import j…

Java | Leetcode Java题解之第363题矩形区域不超过K的最大数值和

题目&#xff1a; 题解&#xff1a; class Solution {public int maxSumSubmatrix(int[][] matrix, int k) {int ans Integer.MIN_VALUE;int m matrix.length, n matrix[0].length;for (int i 0; i < m; i) { // 枚举上边界int[] sum new int[n];for (int j i; j <…

最新动态鲨鱼导航网引导页html源码

源码介绍 最新动态鲨鱼导航网引导页html源码 源码由HTMLCSSJS组成&#xff0c;记事本打开源码文件可以进行内容文字之类的修改&#xff0c;双击html文件可以本地运行效果&#xff0c;也可以上传到服务器里面&#xff0c;重定向这个界面 https://download.csdn.net/download/h…

算法小白刷力扣 3 - 回文数

题目描述 原题链接&#xff1a;https://leetcode.cn/problems/palindrome-number/description/ 给你一个整数 x &#xff0c;如果 x 是一个回文整数&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 回文数是指正序&#xff08;从左向右&#xff09;和倒序&a…