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

一、static成员

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

1.1概念

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

用static修饰的成员函数,称之为静态成员函数。

1.2特性

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

2.静态成员变量必须在类外定义,定义时不添加static关键字,类中只是声明:

  1. 类静态成员即可用 [类名::静态成员] 或者 [对象.静态成员] 来访问,前提是该静态成员公有:

但为了类的封装性,访问私有静态成员时仍使用函数接口访问:4. 静态成员也是类的成员,受public、protected、private 访问限定符的限制。

  1. 静态成员函数没有隐藏的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(外部类)=外部类,和内部类没有任何关系。

三、匿名对象

语法:[类名()]

特性:其生命周期只有一行,下一行时就会自动调用析构函数。

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

cpp 复制代码
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;
}

运行结果:

相关推荐
新手小新2 小时前
C++游戏开发(2)
开发语言·前端·c++
你的电影很有趣2 小时前
lesson30:Python迭代三剑客:可迭代对象、迭代器与生成器深度解析
开发语言·python
程序员编程指南4 小时前
Qt 嵌入式界面优化技术
c语言·开发语言·c++·qt
q__y__L4 小时前
C#线程同步(二)锁
开发语言·性能优化·c#
二川bro4 小时前
第二篇:Three.js核心三要素:场景、相机、渲染器
开发语言·javascript·数码相机
云泽8084 小时前
数据结构前篇 - 深入解析数据结构之复杂度
c语言·开发语言·数据结构
逝雪Yuki5 小时前
数据结构与算法——字典(前缀)树的实现
数据结构·c++·字典树·前缀树·左程云
卷卷的小趴菜学编程5 小时前
Qt-----初识
开发语言·c++·qt·sdk·qt介绍
天天进步20155 小时前
Python游戏开发引擎设计与实现
开发语言·python·pygame
Vic101015 小时前
Hutool 的完整 JSON 工具类示例
开发语言·json