【C++】类和对象⑤(static成员 | 友元 | 内部类 | 匿名对象)
🔥个人主页:Forcible Bug Maker
🔥专栏:C++
目录
前言
static静态成员
友元
友元函数
友元类
内部类
匿名对象
结语
前言
本篇主要内容:类和对象的一些知识点补充,包括static静态成员,友元,内部类等。
本篇基本上就是类和对象主要内容的收尾环节了,在前几篇中,已经将六大默认成员函数逐一做了介绍。接下来的内容就是补充一些语法和细节。那么开始我们今天的内容。
static静态成员
声明为static的类成员称为类的静态成员,用static修饰的成员变量,称之为静态成员变量;用static修饰的成员函数,称之为静态成员函数。静态成员变量一定要在类外进行初始化。
在C++中,static成员是类的成员,但它与类的任何特定对象实例都不关联。也就是说,不管创建了多少个类的对象,static成员都只有一个副本。
static成员可以是成员变量或成员函数。以下是关于static成员的一些关键点:
-
静态数据成员:静态数据成员在类的所有对象之间共享。这意味着无论创建了多少个对象,都只有一个静态数据成员的副本,且此副本存放在静态区。静态数据成员必须在类定义外部进行初始化,且定义时不添加static关键字,类中只是声明。如:
class MyClass { public: static int count; // 声明静态数据成员 }; int MyClass::count = 0; // 在类定义外部初始化静态数据成员
-
静态成员函数:静态成员函数是类的一个成员函数,它可以在没有类的实例的情况下调用。静态成员函数只能访问静态成员(包括静态成员变量和其他静态成员函数)。它们不能访问类的非静态成员,因为非静态成员需要类的实例才能存在,本质上说,静态成员函数没有隐藏的this指针,本身就是无法访问任何非静态成员的。如:
class MyClass { public: static int count; static void GetCount() { count++; // 可以访问静态数据成员 } void doSomething() { // 这里不能访问静态成员count,除非使用 MyClass::count } };
-
访问静态成员:你可以使用类名和作用域解析运算符( :: )来访问静态成员,无论是否创建了类的实例。例如,MyClass::count 和 MyClass::GetCount()。
-
用途:静态成员常用于实现计数器(如上述示例中的count),或者当你想在类的所有实例之间共享某些数据时。静态成员函数通常用于执行与类本身相关但不依赖于任何特定对象实例的操作。
注:虽然静态成员与类的实例不关联,但它们仍然属于类的一部分,并受类的访问访问限定符(如public、protected或private)的影响。
这里用一个面试题,引入关于静态成员变量的使用:实现一个类,计算程序中创建出了多少个对象:
class A { public: A() { ++_scount; } A(const A& t) { ++_scount; } ~A() { --_scount; } static int GetACount() { return _scount; } private: static int _scount; }; int A::_scount = 0; void TestA() { cout