【C++】类和对象(三)完结篇

news2024/12/24 8:16:43

在这里插入图片描述
个人主页
在这里插入图片描述
创作不易,感谢大家的关注!

文章目录

  • ⭐一、再探构造函数
    • 1.初始化列表
  • 🎉二、类型转换
  • 🏠三、static成员
  • 🏝️四、友元
  • ⏱️五、内部类
  • 🎈六、匿名对象
  • 🎡七、在拷贝对象时的编译器优化

⭐一、再探构造函数

之前在实现构造函数时,初始化成员变量主要用于函数体内的赋值,而构造函数的初始化还有另一种方式,就是初始化列表。

1.初始化列表

  1. 使用方式:以一个冒号开始,接着是⼀个以逗号分隔的数据成员列表,每个"成员变量"后面跟一个放在括号中的初始值或表达式。

代码演示:

class Data
{
public:
	Data(int year,int month,int day)
		:_year(year),
		_month(month),
		_day(day)
	{}
private:
	int _year;
	int _month;
	int _day;
};
  1. 特点:
    1.每个成员变量在初始化列表中只能出现一次,在语法层面上即初始化列表是每个成员变量定义初始化的地方。
    2.初始化列表是按照成员变量在类中声明的顺序来进行初始化的,跟成员变量在初始化列表中出现的先后顺序无关。因此建议声明顺序和初始化列表顺序保持⼀致。
    代码演示:
class A
{
public:
	A(int a)
		//先定义_a1
		:_a1(a),
		_a2(_a1)
	{}
	void Print()
	{
		cout << _a1 << " " << _a2 << endl;
	}
private:
	//先声明_a2
	int _a2;
	int _a1;
};
int main()
{
	A aa(1);
	aa.Print();
	return 0;
}

在这里插入图片描述
通过上述代码及运行结果,我们可以看出:_a1的初始化是在_a2之后的,而_a2是以_a1的值来进行初始化的,而由于此时的_a1的值为随机值,因此_a2的值也为随机值。

  1. 注意事项:
    1.引用成员变量和const成员变量没有默认构造的类类型变量,必须放在初始化列表的位置进行初始化,否则会出现编译报错。
    2.C++11支持在成员变量声明的位置给缺省值,这个缺省值主要是给没有显示在初始化列表初始化的成员来使用的。
    3.在日常中,我们还是尽量去使用初始化列表来进行初始化,因为不在初始化列表的成员也会走初始化列表。

🎉二、类型转换

C++支持内置类型隐式类型转换为类类型对象,但需要相关内置类型为参数的构造函数。如果不想其能进行隐式类型转换,可以在构造函数前面加上关键字explict即可。

🏠三、static成员

  1. 定义:用static修饰的成员变量被称为静态成员变量;用static修饰的成员函数被称为静态成员函数,而静态成员函数没有this指针。注:静态成员变量一定要在类外进行初始化。
  2. 特点:
    1.静态成员变量为所有类对象所共享,不属于某个具体的对象且不存在对象中,存放在静态区。
    2.静态成员函数中可以访问其他的静态成员,但是不能访问非静态的,因为没有this指针。
    3.非静态的成员函数,可以访问任意的静态成员变量和静态成员函数。
    4.静态成员也是类的成员,受public、protected、private访问限定符的限制。
    5.类静态成员访问可以通过类名::静态成员 或者 对象.静态成员来访问静态成员变量和静态成员函数。
  3. 注意事项:
    静态成员变量不能在声明位置给缺省值初始化,因为缺省值是构造函数初始化列表的,而静态成员变量不属于某个对象,因此不走构造函数初始化列表。

🏝️四、友元

  1. 概念:友元提供了⼀种突破类访问限定符封装的方式,可分为友元函数和友元类。
  2. 使用方式:在函数声明或者类声明的前面加上friend,并且把友元声明放到⼀个类的里面。
  3. 特点:
    1.友元函数可以在类定义的任何地方声明,不受类访问限定符限制。
    2.一个函数可以是多个类的友元函数。
    3.外部友元函数可访问类的私有和保护成员,而友元函数仅仅是一种声明,并不是类的成员函数。
    4.友元类中的成员函数都可以是另一个类的友元函数,都可以访问另一个类中的私有和保护成员。
    5.友元类的关系是单向的,不具有交换性。例如:A类是B类的友元,但B类并不是A类的友元。
    6.友元类关系不能传递,例如:A类是B类的友元, B类是C类的友元,但A类并不是B类的友元。
  4. 注意事项:
    虽然友元在许多方面上可以带来便利,但友元会增加耦合度,破坏了封装,因此友元不宜多用。

代码演示:

class A
{
	// 友元声明
	friend class B;
private:
	int _a1 = 1;
	int _a2 = 2;
};
class B
{
public:
	void func1(const A& aa)
	{
		cout << aa._a1 << endl;
		cout << _b1 << endl;
	}
	void func2(const A& aa)
	{
		cout << aa._a2 << endl;
		cout << _b2 << endl;
	}
private:
	int _b1 = 3;
	int _b2 = 4;
};

⏱️五、内部类

  1. 定义:如果⼀个类定义在另⼀个类的内部,则这个类就被称为内部类。
  2. 特点:
    1.内部类是⼀个独立的类,跟定义在全局的相比,它只是受外部类类域限制和访问限定符限制,因此外部类定义的对象中不包含内部类。
    2.内部类默认都是外部类的友元类。

代码演示:

class A
{
private:
	static int _a;
	int _b = 1;
public:
	// 默认B类就是A类的友元
	class B 
	{
	public:
			void fuc(const A& a)
		{
			cout << _a << endl;
			cout << a._b << endl;
		}
	};
};
int A::_a = 1;

🎈六、匿名对象

  1. 定义:用类型(实参) 定义出来的对象叫做匿名对象。
  2. 特点:匿名对象生命周期只在当前这一行。

代码演示:

class A
{
public:
	A(int a = 0)
		:_a(a)
	{
		cout << "A(int a)" << endl;
	}
	~A()
	{
		cout << "~A()" << endl;
	}
private:
	int _a;
};

int main()
{
	A();
	A(1);
	return 0;
}

在这里插入图片描述
如上述代码及结果我们可以看出:由于匿名对象的生命周期只在当前这一行,因此在构造函数完后会自动的去调用析构函数。

🎡七、在拷贝对象时的编译器优化

现代编译器会为了尽可能去提高程序的运行效率,在不影响正确性的情况下会尽可能减少⼀些传参和在传参过程中可以省略的拷贝操作。(注:每个编译器的优化效果不同。)

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

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

相关文章

WEB漏洞知识点介绍

简要说明以上漏洞危害情况 SQL注入&#xff1a;对应网站数据库权限&#xff0c;通过这个漏洞可以获取到网站数据库里面的数据&#xff0c;范围不同权限不同&#xff1b; 文件上传&#xff1a;找到文件上传的漏洞大部分可以直接获取到网站权限 xss跨站&#xff1a;围绕网站管理…

运维锅总浅析网络攻击与防范

本文介绍常见的网络攻击手法及防御措施&#xff0c;并进一步介绍如何进行安全教育和培训、攻击溯源。希望对您提高网络安全防范意识有所帮助&#xff01; 一、常见的网络攻击手法 网络攻击手法多种多样&#xff0c;以下是一些常见的网络攻击手法及其基本原理&#xff1a; 1.…

MarkTool之TCP客户端

TCP客户端&#xff0c;主要作用是与TCP服务端连接进行数据通讯 1、连接参数就2个&#xff0c;服务器IP和服务器Port&#xff0c;参数设置好&#xff0c;再点连接则会连接成功 2、接收数据和发送数据的参数设置&#xff0c;有16进制&#xff0c;有字符&#xff0c;有原始数据&a…

Linux:基础命令学习

目录 一、ls命令 实例&#xff1a;-l以长格式显示文件和目录信息 实例&#xff1a;-F根据文件类型在列出的文件名称后加一符号 实例&#xff1a; -R 递归显示目录中的所有文件和子目录。 实例&#xff1a; 组合使用 Home目录和工作目录 二、目录修改和查看命令 三、mkd…

httpx,一个网络请求的 Python 新宠儿

大家好&#xff01;我是爱摸鱼的小鸿&#xff0c;关注我&#xff0c;收看每期的编程干货。 一个简单的库&#xff0c;也许能够开启我们的智慧之门&#xff0c; 一个普通的方法&#xff0c;也许能在危急时刻挽救我们于水深火热&#xff0c; 一个新颖的思维方式&#xff0c;也许能…

项目实战二

Git 服务器 公共代码平台GitLab 配置gitlab 1.设置管理员帐号密码 2.让程序员传代码到20主机上需要配置&#xff1a; 创建用户 mark 1234.com 创建用户组devops 然后把mark 添加到devons 创建项目 http://192.168.88.20/devops/myproject.git 3.客户端操作&#x…

【Linux】—— 进程的基本概念、PCB、fork

&#x1f30f;博客主页&#xff1a;PH_modest的博客主页 &#x1f6a9;当前专栏&#xff1a;Linux跬步积累 &#x1f48c;其他专栏&#xff1a; &#x1f534; 每日一题 &#x1f7e1; C跬步积累 &#x1f7e2; C语言跬步积累 &#x1f308;座右铭&#xff1a;广积粮&#xff0…

数据结构之二叉树详解及遍历算法(C/C#/C++)

文章目录 一、二叉树的基本概念二、二叉树的遍历1. 前序遍历2. 中序遍历3. 后序遍历 三、C语言实现四、C#语言实现五、C语言实现总结 当涉及到数据结构中的二叉树及其遍历方式时&#xff0c;了解如何正确操作和遍历二叉树是至关重要的。以下是关于二叉树及其三种常见遍历方式&a…

现实版的《农夫与蛇》,我给你三连支持,你说我限你流。给你提供资源,你背后骂我们?

文章目录 一、如何上热榜&#xff1f;农夫与蛇的故事1.1 故事之始——遇见“蛇”1.2 退群后——反咬“农夫” 二、事情大发展&#xff01;“我要轰炸你”&#xff01;三、报警不成就开始写文章污蔑四、关于技术交流群五、关于&#x1f34a;易编橙终身成长社群</font> 一、…

ActiViz实战:二维纹理贴图vtkTexture

文章目录 一、效果预览二、基本概念三、功能特性四、与C++不同五、完整示例代码一、效果预览 二、基本概念 vtkTexture是VTK(Visualization Toolkit)中用于纹理映射的一个类,它允许用户将二维图像(纹理)贴到三维物体的表面上,从而增加场景的真实感和细节。 纹理映射:是一…

【JavaEE初阶】线程的状态

目录 &#x1f4d5; 线程的状态 &#x1f333; 观察线程的所有状态 &#x1f6a9; NEW 状态 &#x1f6a9; TERMINATED 状态 &#x1f6a9; RUNNABLE 就绪状态 &#x1f6a9; WAITING 状态 &#x1f6a9; TIME_WAITING 状态 &#x1f6a9; BLOCKED 状态 &#x1f384;…

SpringCLoud OpenFeign的使用介绍

Spring Cloud OpenFeign使用介绍 文章目录 Spring Cloud OpenFeign使用介绍导引1. 简单介绍2. 操作方式3. 参数传递3.1 传递单个参数3.2 传递多个参数3.3 传递对象3.4 传递JSON类型参数 4. 最佳实践 导引 在之前的文章中&#xff0c;我们使用过RestTemplate来进行远程调用&…

云动态摘要 2024-07-23

给您带来云厂商的最新动态,最新产品资讯和最新优惠更新。 最新优惠与活动 数据库上云优选 阿里云 2024-07-04 RDS、PolarDB、Redis、MongoDB 全系产品新用户低至首年6折起! [免费体验]智能助手ChatBI上线 腾讯云 2024-07-02 基于混元大模型打造,可通过对话方式生成可视化…

docker笔记4-部署

docker笔记4-部署 一、部署nginx二、部署Tomcat三、部署ESKibana3.1 部署ES3.2 部署kibana 一、部署nginx docker search nginx #搜索nginx的最新版本docker pull nginx #这里可以指定nginx版本&#xff0c;如果不指定&#xff0c;那么就拉取最新版本latestdocker run -d --na…

pikachu Fileinclusion(local)

随便选择一个都试试 发现url上数字会变 发现文件名确实是file1.php~file5.php 那么会不会还有别的burp抓包选中数字 设置6-100的爆破 strat attack 678异常还有个100也是 先改一下试试看 其他的会报错 但是通过这我们可以得到路径 先写一个 下一步 读取系统文件 windows系统肯定…

TCP客户端connect断线重连

文章目录 TCP客户端connect断线重连1、为什么要断线重连2、实现代码 TCP客户端connect断线重连 1、为什么要断线重连 客户端会面临服务器崩溃的情况&#xff0c;我们可以试着写一个客户端重连的代码&#xff0c;模拟并理解一些客户端行为&#xff0c;比如游戏客户端等. 考虑到…

并发编程面试题0

并发编程 1、并行和并发有什么区别&#xff1f; 并行和并发都是指多个任务同时执行的概念&#xff0c;但是它们之间有着明显的区别 并行&#xff1a;多个任务在同一时间同时执行&#xff0c;通常需要使用多个处理器或者多核处理器来实现。例如&#xff0c;一个多核CPU的计算机…

国内大陆地区huggingface连接不上的解决方案

简介 本文主要介绍国内大陆地区huggingface连接不上的解决方案,希望能对学习大模型的同学们有所帮助。 1. 背景 最近有不少同学反应无法正常下载huggingface的模型文件,亲自尝试使用git clone下载huggingface上的大模型文件时,也同样无法正常下载,以Meta-Llama-3-8B为例…

美食地图开发

调用地图接口展示数据库录入的不同类别地址信息&#xff0c;提供导航服务&#xff0c;手机端电脑端自适应。 语音介绍使用微软的tts接口可选不同语音性别生成

【数据结构】AVL树(图文解析 + 代码实现)

目录 1、AVL树的概念 2、AVL树结点的定义 3、AVL树的插入 4、AVL树的旋转 4.1 左单旋 4.2 右单旋 4.3 右左双旋 4.4 左右双旋 5、AVL树的验证 6、AVL树的性能 前面对map/multimap/set/multiset进行了简单的介绍&#xff0c;会大仙&#xff0c;这几个容器有个共同点是…