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

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

文章目录

  • ⭐一、再探构造函数
    • 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://先声明_a2int _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.mzph.cn/diannao/50356.shtml

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

相关文章

火焰传感器 - 从零开始认识各种传感器【第十六期】

火焰传感器|从零开始认识各种传感器 1、什么是火焰传感器 火焰传感器是一种用于检测火焰或火光的传感器。它可以快速、准确地检测到周围环境中火源的存在&#xff0c;从而在火灾发生之初及时向消防人员或相关机构发送报警信息&#xff0c;以便及时采取措施进行火灾扑救。此外…

C# 贪吃蛇游戏

贪吃蛇游戏可分为手动玩法和自动玩法 冯腾飞/贪吃蛇

【网络安全学习】 SQL注入01:基础知识

&#x1f4bb; 1. 什么是SQL注入 SQL注入是一种针对Web程序中数据库层的安全漏洞的攻击方式。它利用了程序对用户输入数据合法性的判断或过滤不严&#xff0c;允许攻击者在设计不良的程序中添加额外的SQL语句&#xff0c;从而执行计划外的命令或访问未授权的数据。攻击者可以通…

Docker搭建私有仓库harbor(docker 镜像仓库搭建)

Harbor介绍 Docker容器应用的开发和运行离不开可靠的镜像管理&#xff0c;虽然Docker官方也提供了公共的镜像仓库&#xff0c;但是从安全和效率等方面考虑&#xff0c;部署我们私有环境内的Registry也是非常必要的。Harbor是由VMware公司开源的企业级的Docker Registry管理项目…

Android statsd 埋点简析

源码基于&#xff1a;Android U 0. 前言 最近在研究 Android 自带的系统数据指标采集功能&#xff0c;框架依旧很严谨、完美&#xff0c;这里做个分享。 1. Android S 之后变化 stats 的代码从 framework 或 system/core 中转移到了 packages/modules/StatsD 目录中。 2. 框架…

IEC104转MQTT网关轻松将IEC104设备数据传输到Zabbix、阿里云、华为云、亚马逊AWS、ThingsBoard、Ignition云平台

随着工业4.0的深入发展和物联网技术的广泛应用&#xff0c;IEC 104&#xff08;IEC 60870-5-104&#xff09;作为电力系统中的重要通信协议&#xff0c;正逐步与各种现代监控、管理和云平台实现深度融合。IEC104转MQTT网关BE113作为这一融合过程中的关键设备&#xff0c;其能够…

动手学深度学习V2每日笔记(模型选择+过拟合和欠拟合)

本文主要参考沐神的视频教程 https://www.bilibili.com/video/BV1K64y1Q7wu/?spm_id_from333.788.recommend_more_video.0&vd_sourcec7bfc6ce0ea0cbe43aa288ba2713e56d 文档教程 https://zh-v2.d2l.ai/ 本文的主要内容对沐神提供的代码中个人不太理解的内容进行笔记记录&a…

通过IEC104转MQTT网关轻松接入阿里云平台

随着智能电网和物联网技术的飞速发展&#xff0c;电力系统中的传统IEC 104协议设备正面临向现代化、智能化转型的迫切需求。阿里云作为全球领先的云计算服务提供商&#xff0c;其强大的物联网平台为IEC 104设备的接入与数据处理提供了强大的支持。本文将深入探讨钡铼网关在MQTT…

linux查看某个是否被占用以及释放端口

在 Linux 系统中&#xff0c;可以使用多种方法来检查某个端口是否被占用&#xff0c;并释放该端口。以下是详细的步骤&#xff1a; 1. 检查端口是否被占用 使用 netstat sudo netstat -tuln | grep <port_number>例如&#xff0c;要检查端口 8080 是否被占用&#xff…

UML通信图建模技术及应用例

新书速览|《UML 2.5基础、建模与设计实践》 在对系统的动态行为进行建模时&#xff0c;通信图常被用于按组织结构对控制流进行建模。与顺序图一样&#xff0c;一个单独的通信图只能显示一个控制流。 使用通信图建模时可以遵循如下策略&#xff1a; &#xff08;1&#xff09…

WinDbg用户模式调试基础

WinDbg用户模式调试基础 在前面的文章中&#xff0c;介绍了如何使用WinDbg分析蓝屏原因https://www.cnblogs.com/zhaotianff/p/15150244.html 不过那会都是在网上找的资料&#xff0c;东拼西凑出来&#xff0c;并没有系统的去学习WinDbg。 最近在学习内核开发这一块的内容&…

Arrays.asList()创建的集合不能使用remove函数

Arrays.asList() 创建的集合确实不能直接使用 remove 方法&#xff0c;这是因为该方法返回的集合是一个固定大小的列表&#xff0c;背后由一个数组支持。由于数组的长度是固定的&#xff0c;所以这个列表也不能增加或减少元素。 以下是详细解释和解决方案&#xff1a; 原因 …

顺序表的实现和操作

目录 一.前言 二. 顺序表的优缺点 三. 顺序表的定义和初始化 四.顺序表的相关操作 一.前言 首先介绍下线性表的定义&#xff0c;线性表是具有相同特性的数据元素的一个有限序列。而我们的顺序表就是线性表的一种&#xff0c;是线性表的顺序存储结构。所谓顺序存储就是把逻辑…

Photos框架 - 自定义媒体选择器(UI列表)

引言Photos框架 - 自定义媒体资源选择器&#xff08;数据部分&#xff09;-CSDN博客 关于自定义媒体选择器上一篇博客我们已经介绍了使用Photos获取媒体资源数据和处理媒体资源数据&#xff0c;有了数据&#xff0c;UI的实现就比较灵活了&#xff0c;我就以上面的设计样式为例…

LabVIEW操作系列1

系列文章目录 我的记录&#xff1a; LabVIEW操作系列 文章目录 系列文章目录前言五、特殊用法5.1 取值范围表示5.2 对输入值取值范围进行限定5.3 控制多个While循环停止运行。5.4 获取按钮上的文本5.5 获取按钮上的文本【进阶】 六、使用步骤1.引入库2.读入数据 七、其余功能7.…

数学建模基础:数据的分析与模型构建

引言 在当今数据驱动的世界中&#xff0c;数学建模已成为解决复杂问题的关键工具。本篇文章将探讨数学建模的基础知识&#xff0c;特别是数据处理与拟合模型的重要性和方法。 第一部分&#xff1a;数据的重要性 数据是数学建模的基石。在开始任何建模工作之前&#xff0c;我…

Spring源码(六)--Bean生命周期相关的接口

Bean生命周期相关的接口 Bean生命周期接口相关的这些类和接口&#xff0c;都可以多看看。 Bean工厂实现应该尽可能支持标准的Bean生命周期接口。 整套初始化方法及其标准顺序为: * * <li>BeanNameAwares {code setBeanName}* <li>BeanClassLoaderAwares {code se…

2.5 openCv -- 使用 OpenCV 合并(混合)两张图片

目标 在本教程中,您将学习: 什么是线性混合及其用途;如何使用 addWeighted() 函数合并两张图片。理论 注释 下面的解释来自 Richard Szeliski 的书籍《计算机视觉:算法与应用》。 从我们之前的教程中,我们已经了解了一些像素运算符。一个有趣的二元(双输入)运算符是线…

【Python selenium过极验五子棋】自动化过五子棋人机验证,享受丝滑的落子,秒了

文章日期&#xff1a;2024.07.25 使用工具&#xff1a;Python 文章类型&#xff1a;自动化过极验五子棋 文章全程已做去敏处理&#xff01;&#xff01;&#xff01; 【需要做的可联系我】 AES解密处理&#xff08;直接解密即可&#xff09;&#xff08;crypto-js.js 标准算法…

Spring Boot(八十二):SpringBoot通过rsa实现API加密

项目中使用RSA加密方式对API接口返回的数据加密,让API数据更加安全。别人无法对提供的数据进行破解。Spring Boot接口加密,可以对返回值、参数值通过注解的方式自动加解密 。 下面开始代码演示 1 接口加密 1.1 新建一个springboot项目 1.2 添加依赖 <dependency>&l…