[C++探索]初始化列表,static成员,友元函数,内部类,匿名对象

news2024/9/9 1:22:28

💖💖💖欢迎来到我的博客,我是anmory💖💖💖
又和大家见面了
欢迎来到C++探索系列
作为一个程序员你不能不掌握的知识
先来自我推荐一波
个人网站欢迎访问以及捐款
推荐阅读
如何低成本搭建个人网站
专栏:动画详解leetcode算法题
C语言知识
玉桂狗听音乐

初始化列表

对于类对象中的每一个成员,可以对其进行初始化,如下所示:

#include <iostream>
using namespace std;

class A
{
public:
	A()
		:_a(1)
		,_b(2)
		,_c(3)
	{}
	void Print()
	{
		cout << _a << " " << _b << " " << _c << endl;
	}
private:
	int _a;
	int _b;
	int _c;
};

int main()
{
	A a1;
	a1.Print();
	return 0;
}

这,就是初始化列表的形式:

A()
		:_a(1)
		,_b(2)
		,_c(3)
	{}

不难看出,它是一个构造函数,这就是初始化列表的一个特点

有三种情况必须使用初始化列表

  • const变量
  • 引用
  • 没有默认构造函数的类类型变量

原因如下:
我们知道引用是必须初始化的,因此在类里的引用也必须初始化,否则会报错
const是一个常量,只能在申明的时候赋值初始化,因此也必须初始化
没有默认构造函数的类类型变量由于没有初始化,将会是一个随机值,很危险

static成员

• ⽤static修饰的成员变量,称之为静态成员变量,静态成员变量⼀定要在类外进⾏初始化。
• 静态成员变量为所有类对象所共享,不属于某个具体的对象,不存在对象中,存放在静态区。
• ⽤static修饰的成员函数,称之为静态成员函数,静态成员函数没有this指针。
• 静态成员函数中可以访问其他的静态成员,但是不能访问⾮静态的,因为没有this指针。
• ⾮静态的成员函数,可以访问任意的静态成员变量和静态成员函数。
• 突破类域就可以访问静态成员,可以通过类名::静态成员 或者 对象.静态成员来访问静态成员变量和静态成员函数。
• 静态成员也是类的成员,受public、protected、private 访问限定符的限制。
• 静态成员变量不能在声明位置给缺省值初始化,因为缺省值是个构造函数初始化列表的,静态成员变量不属于某个对象,不⾛构造函数初始化列表。

友元函数

• 友元提供了⼀种突破类访问限定符封装的⽅式,友元分为:友元函数和友元类,在函数声明或者类
声明的前⾯加friend,并且把友元声明放到⼀个类的⾥⾯。
• 外部友元函数可访问类的私有和保护成员,友元函数仅仅是⼀种声明,他不是类的成员函数。
• 友元函数可以在类定义的任何地⽅声明,不受类访问限定符限制。
• ⼀个函数可以是多个类的友元函数。
• 友元类中的成员函数都可以是另⼀个类的友元函数,都可以访问另⼀个类中的私有和保护成员。
• 友元类的关系是单向的,不具有交换性,⽐如A类是B类的友元,但是B类不是A类的友元。
• 友元类关系不能传递,如果A是B的友元, B是C的友元,但是A不是C的友元。
• 有时提供了便利。但是友元会增加耦合度,破坏了封装,所以友元不宜多⽤。

// 前置声明,都则A的友元函数声明编译器不认识B
class B;
class A
{
	// 友元声明
	friend void func(const A& aa, const B& bb);
private:
	int _a1 = 1;
	int _a2 = 2;
};

class B
{
	// 友元声明
	friend void func(const A& aa, const B& bb);
private:
	int _b1 = 3;
	int _b2 = 4;
};
void func(const A& aa, const B& bb)
{
	cout << aa._a1 << endl;
	cout << bb._b1 << endl;
}
int main()
{
	A aa;
	B bb;
	func(aa, bb);
	return 0;
}

内部类

• 如果⼀个类定义在另⼀个类的内部,这个内部类就叫做内部类。内部类是⼀个独⽴的类,跟定义在
全局相⽐,他只是受外部类类域限制和访问限定符限制,所以外部类定义的对象中不包含内部类。
• 内部类默认是外部类的友元类。
• 内部类本质也是⼀种封装,当A类跟B类紧密关联,A类实现出来主要就是给B类使⽤,那么可以考
虑把A类设计为B的内部类,如果放到private/protected位置,那么A类就是B类的专属内部类,其
他地⽅都⽤不了。

#include<iostream>
using namespace std;
class A
{
private:
	static int _k;
	int _h = 1;
public:
	class B // B默认就是A的友元
	{
	public:
		void foo(const A& a)
		{
			cout << _k << endl; //OK
			cout << a._h << endl; //OK
		}
	};
};
int A::_k = 1;
int main()
{
	cout << sizeof(A) << endl;
	A::B b;
	A aa;
	b.foo(aa);
	return 0;
}

匿名对象

• ⽤ 类型(实参) 定义出来的对象叫做匿名对象,相⽐之前我们定义的 类型 对象名(实参) 定义出来的
叫有名对象
• 匿名对象⽣命周期只在当前⼀⾏,⼀般临时定义⼀个对象当前⽤⼀下即可,就可以定义匿名对象。

class A
{
public:
	A(int a = 0)
		:_a(a)
	{
		cout << "A(int a)" << endl;
	}
	~A()
	{
		cout << "~A()" << endl;
	}
private:
	int _a;
};
class Solution {
public:
	int Sum_Solution(int n) {
		//...
		return n;
	}
};
int main()
{
	A aa1;
	// 不能这么定义对象,因为编译器⽆法识别下⾯是⼀个函数声明,还是对象定义
	//A aa1();
	// 但是我们可以这么定义匿名对象,匿名对象的特点不⽤取名字,
	// 但是他的⽣命周期只有这⼀⾏,我们可以看到下⼀⾏他就会⾃动调⽤析构函数
	A();
	A(1);
	A aa2(2);
	// 匿名对象在这样场景下就很好⽤,当然还有⼀些其他使⽤场景,这个我们以后遇到了再说
	Solution().Sum_Solution(10);
	return 0;
}

结语

💖💖💖非常感谢各位的支持💖💖💖
我们共同进步
本系列持续更新,关注我,带你了解更多C++知识
下期再见
玉桂狗听音乐

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

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

相关文章

Docsify:快速用Markdown文档搭建网站的利器

Github官方地址&#xff1a;Docsify 什么是Docsify&#xff1f; 对于经常写博客的人来说&#xff0c;markdown大家都不陌生。今天介绍一个在最近需求中碰到的软件Docsify&#xff0c;通过它能够将Markdown直接转换为网页。话不多说&#xff0c;下面直接介绍它的快速用法。 D…

(二)延时任务篇——通过redis的key监听,实现延迟任务实战

前言 本节内容是关于使用redis的过期key&#xff0c;通过开启其监听失效策略&#xff0c;模拟订单延迟任务的执行流程。其核心原理是通过使用redis订阅与发布的方式&#xff0c;将过期失效的key通过广播的方式&#xff0c;发布给客户端&#xff0c;客户端可以监听此消息进而消…

如何将旧电脑的数据迁移到新电脑?旧电脑数据迁移技巧

随着科技的不断发展&#xff0c;电脑硬件的更新换代速度也越来越快。当我们购买了一台新电脑时&#xff0c;如何将旧电脑的数据迁移到新电脑&#xff0c;成为了我们必须面对的问题。本文将详细介绍几种数据迁移的方法&#xff0c;帮助您顺利完成数据迁移&#xff0c;确保重要资…

【已解决】ERROR: No matching distribution found for torch.安装torch一次性解决方法

文章目录 环境异常原因直接解决方案成功 环境 python 安装 torch 异常 (base) ➜ ComfyUI git:(master) pip install -i https://pypi.mirrors.ustc.edu.cn/simple torch Looking in indexes: https://pypi.mirrors.ustc.edu.cn/simple ERROR: Could not find a version tha…

无人机WIFI集群组网技术详解及成本分析

一、技术详解 1. 无人机WIFI集群组网概述 无人机WIFI集群组网技术是指利用无人机作为移动平台&#xff0c;通过集成高性能的WIFI模块&#xff0c;实现多架无人机之间以及无人机与地面控制站之间的无线通信组网。该技术不仅能够提升无人机集群的协同作业能力&#xff0c;还能在…

【每日一题】python输入两个字,共随机出现100个,查询分别出现多少次

print(""" 分别输入两个字&#xff0c;共100个字&#xff0c;随机出现。 自动查询每个字出现的次数 """) str1input("输入一个字:") str2input("输入一个字:") import random m[str1,str2] i1 x0 y0 while i<9…

代码改进跑通 创新点 文章复现 人工智能

代码改进跑通➕创新点➕文章复现➕人工智能 高质量接创新点代码改进跑通复现代码&#xff0c;模型优化 python代跑时间序列预测分析代码编写python编 程 深度学习算法自然语言处理神经网络跑通指导爬虫调试 项目指导定制代做改进提升创新优化Python Matlab COpencvNlp Pytorch …

C++(week15): C++提高:(三)计算机网络

文章目录 一、计算机网络基础1.协议概念2.分层模型3.协议格式(1)以太网帧格式(2)IP段格式(3)TCP/UDP数据报格式4.TCP协议(1)TCP协议的特点(2)三次握手(3)四次挥手(4)SYN攻击5.状态迁移图的解析:11种状态6.TCP通信状态与程序结合分析二、网络编程(Socket编程)1.网络编程基础2.字…

《LeetCode热题100》---<哈希三道>

本篇博客讲解 LeetCode热题100道中的哈希篇中的三道题。分别是 1.第一道&#xff1a;两数之和&#xff08;简单&#xff09; 2.第二道&#xff1a;字母异位词分组&#xff08;中等&#xff09; 3.第三道&#xff1a;最长连续序列&#xff08;中等&#xff09; 第一道&#xff1…

各类型算法题整理(python、c++版)hot100

1. 组合数&#xff1a;n个数找k个数的组合 这题的核心是每次遍历从begin到n之间的所有数&#xff0c;并放到一个path里。当pathk的时候返回。要注意两点&#xff1a; &#xff08;1&#xff09;不要在path长度为k的时候清空path&#xff01;回溯不需要清空&#xff0c;因为回…

夏季如何预防脑血管疾病

众所周知&#xff0c;冬季是脑血管病的高发季节。然而&#xff0c;还有资料显示&#xff0c;在炎炎夏日&#xff0c;脑血管疾病的发病率也呈明显的上升趋势。为什么夏季也会高发脑血管病呢&#xff1f;我们来一起了解一下。 1. 出汗量大大增加&#xff0c;血容量就会减少&#…

【Java】韩顺平Java学习笔记 第22章 多用户通讯系统

文章目录 项目开发流程需求分析整体分析用户登录注意 拉取在线用户列表无异常退出私聊功能注意 发送文件服务端推送新闻接收离线消息和文件 项目开发流程 需求分析设计阶段实现阶段测试阶段实施阶段维护阶段 需求分析 用户登录拉取在线用户列表无异常退出&#xff08;客户端、…

【BES2500x系列 -- RTX5操作系统】系统执行流程 -- 引导程序(boot loader)--(十)

&#x1f48c; 所属专栏&#xff1a;【BES2500x系列】 &#x1f600; 作  者&#xff1a;我是夜阑的狗&#x1f436; &#x1f680; 个人简介&#xff1a;一个正在努力学技术的CV工程师&#xff0c;专注基础和实战分享 &#xff0c;欢迎咨询&#xff01; &#x1f49…

【C++】嵌套循环案例 乘法口诀表

乘法口诀表利用嵌套循环语句就可以实现 下面是一个实例 #include<iostream> using namespace std;int main() {for (int i 1; i < 10; i){for (int j 1; j < i; j){cout << j << " * " << i << " " << i *…

Agent终于能主动进化?揭秘首个让AI自我进化的训练框架!突破人类专家局限,告别手动调优!端到端符号化框架如何引领AI自我革命

随着大型语言模型(LLMs)的兴起和AI Agent框架的开源&#xff0c;基于这些强大模型的智能体在学术界和工业界受到了极大的关注&#xff0c;并在多个场景中取得了显著的成果。然而&#xff0c;尽管AI Agent在一些应用中已经落地&#xff0c;其研究和开发仍然主要依赖于“专家中心…

Apollo:目录分析, test ok

apollo: Apollo (阿波罗)是一个开放的、完整的、安全的平台,将帮助汽车行业及自动驾驶领域的合作伙伴结合车辆和硬件系统,快速搭建一套属于自己的自动驾驶系统。 - Gitee.comhttps://github.com/ApolloAuto/apolloapollo 目录名称目录作用cyber消息中间件,替换ros作为消息层…

2024年【制冷与空调设备运行操作】考试题及制冷与空调设备运行操作新版试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 制冷与空调设备运行操作考试题根据新制冷与空调设备运行操作考试大纲要求&#xff0c;安全生产模拟考试一点通将制冷与空调设备运行操作模拟考试试题进行汇编&#xff0c;组成一套制冷与空调设备运行操作全真模拟考试…

python绘制图像无法显示汉字、数字

解决的问题&#xff1a;python绘制图像无法正确显示汉字、数字&#xff0c;图中汉字数字以方块形式显示。 直接先上代码&#xff1a; # 确保图表中的汉字可以显示 plt.rcParams["font.sans-serif"] ["SimHei"] plt.rcParams["axes.unicode_minus…

25.惰性队列

介绍 消费者由于各种原因而致使长时间不能消费消息造成堆积。比如有一百万条消息发送到mq中&#xff0c;消费者这时宕机了不能消费消息&#xff0c;造成了消息堆积。惰性队列就有必要了。 正常情况下&#xff0c;消息保存在内存中。消费者从内存中读取消息消费&#xff0c;速…

【设计模式】代理模式详解

1.简介 代理模式是常用的Java设计模式&#xff0c;该模式的特点是代理类与委托类共享相同的接口。代理类主要负责预处理消息、过滤消息、将消息转发给委托类&#xff0c;并在事后处理消息等。代理类与委托类之间通常存在关联关系&#xff0c;一个代理类对象与一个委托类对象关…