类和对象(3)——最终篇

news/2025/3/29 6:59:57/

一、static成员

在C语言的学习中,我们就已经见识过这个关键字了,一般的程序的代码储存在栈中,而static修饰的代码放在静态区中。现在,我们的static可以修饰类中的成员变量,会发生怎样的变化呢?

1.1概念

声明为static的类成员称为类的静态成员,用static修饰的成员变量,称之为静态成员变量;
用static修饰的成员函数,称之为静态成员函数。

1.2特性

1.静态成员为所有类对象所共享,不属于某个具体的对象,存放在静态区

2.静态成员变量必须在类外定义,定义时不添加static关键字,类中只是声明:
3. 类静态成员即可用 [类名::静态成员] 或者 [对象.静态成员] 来访问,前提是该静态成员公有:

但为了类的封装性,访问私有静态成员时仍使用函数接口访问:4. 静态成员也是类的成员,受public、protected、private 访问限定符的限制。
5. 静态成员函数没有隐藏的this指针,不能访问任何非静态成员:

二、友元

友元提供了一种突破封装的方式,有时提供了便利。
但是友元会增加耦合度,破坏了封装,所以友元不宜多用。
友元分为友元类和友元函数。

2.1友元类

假设我们要设置两个类,TV电视机和Remote遥控器,我们想操控电视机的频道、声音等数据,我们直接在TV类中设置类似函数好像不合情理,而在Remote类中设置就正常多了,但是TV类中的都是私有数据,Remote类怎么能打破这一特性呢?答案是使用友元类。

友元类的特性:
1.友元关系是单向的,不具有交换性。(电视无法操纵遥控器)
2.友元关系不能传递,如果C是B的友元, B是A的友元,则不能说明C时A的友元。(遥控器是电视的友元,插座也是电视的友元,但是遥控器不能操控插座,反之亦然)
3.友元关系不能继承。(同一个遥控器能操控一代电视,但不能操控二代电视)

2.2友元函数

友元函数可以直接访问类的私有成员,它是定义在类外部的普通函数不属于任何类,但需要在类的内部声明,声明时需要加friend关键字。

1.友元函数可访问类的私有和保护成员,但不是类的成员函数
2.友元函数不能用const修饰
3.友元函数可以在类定义的任何地方声明,不受类访问限定符限制

2.3内部类

概念:
如果一个类定义在另一个类的内部,这个内部类就叫做内部类。内部类是一个独立的类,它不属于外部类,更不能通过外部类的对象去访问内部类的成员。外部类对内部类没有任何优越的访问权限
注意:
内部类就是外部类的友元类,内部类可以通过外部类的对象参数来访问外部类中的所有成员。但是外部类不是内部类的友元。
特性:
1. 内部类可以定义在外部类的public、protected、private。
2. 注意内部类可以直接访问外部类中的static成员,不需要外部类的对象/类名。
3. sizeof(外部类)=外部类,和内部类没有任何关系。

三、匿名对象

语法:[类名()]
特性:其生命周期只有一行,下一行时就会自动调用析构函数。

希望大家从下面的代码与其执行结果中看出匿名对象的生命周期:

class Date
{
public:Date(int year = 2024, int month = 2, int day = 29):_year(year),_month(month),_day(day) {cout << "Hi:";PrintDate();}void PrintDate(){cout << _year << "." << _month << "." << _day << endl;}~Date(){cout << "Bye~:";PrintDate();}
private:int _year = 2024;int _month = 2;int _day = 29;
};
int main()
{Date();Date d1(2024, 3, 1);Date d2(2024, 3, 2);return 0;
}

运行结果:


http://www.ppmy.cn/news/1367006.html

相关文章

simple-pytest 框架使用指南

simple-pytest 框架使用指南 一、框架介绍简介框架理念&#xff1a;框架地址 二、实现功能三、目录结构四、依赖库五、启动方式六、使用教程1、快速开始1.1、创建用例&#xff1a;1.2、生成py文件1.3、运行脚本1.3.1 单个脚本运行1.3.2 全部运行 1.4 报告查看 2、功能介绍2.1、…

如何清空远程Git仓库中的所有文件和文件夹,并将其恢复为初始状态?

如何清空远程Git仓库中的所有文件和文件夹&#xff0c;并将其恢复为初始状态&#xff1f; 如何将一个已经存在的远程Git仓库恢复到初始状态&#xff1f;即清空所有文件和文件夹&#xff0c;使其完全空白。这可能是出于某些原因&#xff0c;比如想要重新开始仓库&#xff0c;或…

《TCP/IP详解 卷一》第8章 ICMPv4 和 ICMPv6

目录 8.1 引言 8.1.1 在IPv4和IPv6中的封装 8.2 ICMP 报文 8.2.1 ICMPv4 报文 8.2.2 ICMPv6 报文 8.2.3 处理ICMP报文 8.3 ICMP差错报文 8.3.1 扩展的ICMP和多部报文 8.3.2 目的不可达和数据包太大 8.3.3 重定向 8.3.4 ICMP 超时 8.3.5 参数问题 8.4 ICMP查询/信息…

高光谱遥感学习入门丨高光谱数据处理基础、Python和Matlab高光谱遥感数据处理

目录 ①Python高光谱遥感数据处理与高光谱遥感机器学习方法深度应用 ②Matlab高光谱遥感、数据处理与混合像元分解实践技术应用 ③高光谱遥感数值建模技术及在植被、水体、土壤信息提取领域应用 更多应用 高光谱遥感信息对于我们认识世界具有重要意义。尽管大部分物质在人眼…

【Rust】——结构体struct

&#x1f383;个人专栏&#xff1a; &#x1f42c; 算法设计与分析&#xff1a;算法设计与分析_IT闫的博客-CSDN博客 &#x1f433;Java基础&#xff1a;Java基础_IT闫的博客-CSDN博客 &#x1f40b;c语言&#xff1a;c语言_IT闫的博客-CSDN博客 &#x1f41f;MySQL&#xff1a…

NLP Seq2Seq模型

&#x1f368; 本文为[&#x1f517;365天深度学习训练营学习记录博客&#x1f366; 参考文章&#xff1a;365天深度学习训练营&#x1f356; 原作者&#xff1a;[K同学啊 | 接辅导、项目定制]\n&#x1f680; 文章来源&#xff1a;[K同学的学习圈子](https://www.yuque.com/mi…

MyBatis 学习(三)之 MyBatis 全局配置文件

目录 1 MyBatis 全局配置文件 2 properties 元素 3 setting 设置 4 typeAlianses 别名处理器 5 typeHandler 类型处理器 6 objectFacotry 对象工厂&#xff08;了解&#xff09; 7 plugins 插件&#xff08;了解&#xff09; 8 environments 运行环境 9 databaseIdPro…

Unity中URP实现水体(整理优化)

文章目录 前言一、优化水的深度1、我们把 水流动的方向 和 水深浅过渡值&#xff0c;整合到一个四维变量中2、修改 水体流动方向3、在片元着色器中&#xff0c;修改使用过渡变量 二、优化泡沫三、优化水下的扭曲1、修复原本扰动UV的计算 四、优化水面高光1、把高光强度、光滑度…