「C++ 类和对象篇 12」static成员

本文详细介绍了C++中的静态成员,包括其定义、为何需要、如何使用以及特性。静态成员是类的共享数据和类级别操作的体现,可用于计数、共享数据、类的单例实现等。
摘要由CSDN通过智能技术生成

目录

一、static成员是什么?

二、为什么需要static成员? 

三、怎么使用static成员?

1. 定义static成员变量 

2. 定义static成员函数 

3. 访问static成员

四、特性

【面试题】

【总结】 


一、static成员是什么?

       被static修饰的类成员称为类的静态成员:用static修饰的成员变量,称之为静态成员变量;用static修饰成员函数,称之为静态成员函数


二、为什么需要static成员? 

我们如何能快速的知道一个类有多少个对象?其中一个方法就是通过static成员来计算:

//我们如何能快速的知道一个类有多少个对象?其中一个方法就是通过static成员来计算:
#include<iostream>
using std::cin; using std::cout; using std::endl;

class A{
public:
	A(){
		count++;
	}
	A(const A& a){
		count++;
	}
	void PrintC(){
		cout << count << endl;
	}
private:
	static int count;
};

int A::count = 0;

int main()
{
	A a, b;
	A c(a);
	a.PrintC();  // 结果为3。
	return 0;
}

         从以上例子可看出,static成员的一个作用是作为计数器或标志,static成员变量可以用作类的计数器或标志,以跟踪类的实例数量或记录某些类级别的状态。

 static成员的作用:

  1. 共享数据:static成员变量是类的所有实例共享的,它们在所有类的实例之间保持一致。这意味着无论创建多少个类的实例,它们都共享相同的static成员变量。这对于需要在类的所有实例之间共享数据的情况非常有用。

  2. 类级别操作:static成员函数是类的成员函数,而不是实例的成员函数。它们可以在没有类实例的情况下被调用,因为它们不依赖于任何特定的实例数据。这使得它们能够执行类级别的操作,例如访问和修改只与类有关的数据(例如类的计数器)。

  3. 避免重复定义:static成员变量和函数可以用来避免重复定义。它们只在类的定义文件中声明一次,而不是在每个实例中定义。

  4. 实现单例模式static成员在实现单例设计模式时非常有用。单例模式确保一个类只有一个实例,并提供一个全局访问点来获取该实例。这通常是通过使用static成员(如静态实例指针和静态获取实例的方法)来实现的。


三、怎么使用static成员?

1. 定义static成员变量 

以下是定义static成员变量的步骤和示例:

  1. 在类声明中声明static成员变量。(类内要写static)

  2. 在类外部使用类名加作用域限定符::来初始化、访问和修改static成员变量。(类外不需要写static)

class A{
private:
	static int count;
};

int A::count = 0;

2. 静态成员变量初始化

  • 非const静态成员变量只能在类的外部进行初始化 :
class Student
{
    // 在类内部定义静态成员
    static int number;
};
// 非const静态成员变量只能在类的外部进行初始化   
int Student::number = 1;
  • const静态成员变量能在类内进行初始化 :
class Student
{
    // const静态成员能在类中初始化
    const static int number = 1;
};

3. 定义static成员函数 

        static成员函数可以将声明和定义都写在类中;也可以将声明和定义分离,在类外定义函数体。


eg1. 将声明和定义都写在类中:

class A{
public:
	static void PC()
	{
		cout << 1 << endl;
	}
};

eg2. 声明和定义分离:

class A{
public:
	static void P();
};

void A::P() // 在类外定义时不需要写static
{
	cout << count << endl;
}

对于比较短的函数可以直接在类中定义,且在static后加上inline使其成为内联函数。

4. 访问static成员

类静态成员可用 类名::静态成员 或者 对象.静态成员 来访问:

  • 使用域操作符访问 : 格式为 类名::静态成员变量名 ;
	// 静态成员可以直接不创建对象直接通过类来访问:
    Student::learn();
    cout << Student::school << endl;
	
  • 使用类对象访问 : 格式为 对象名称.静态成员变量名
    // 对象名称.静态成员变量名
	// 静态成员也可以通过对象来访问:
	Student s; //创建
	s.learn();
    cout << s.school << endl;

5. 静态成员变量生命周期

静态成员变量 的 生命周期 就是 程序的声明周期 ;

静态成员变量 在 应用启动时 初始化 , 在 进程结束时销毁 ;

静态成员变量在多个对象之间共享 , 在 程序生命周期 之内 , 类的多个对象的 静态成员的值 是相同的 ;


四、特性

  1. 静态成员为所有类对象所共享,不属于某个具体的对象,存放在静态区。
  2. 静态成员变量必须在类外定义,初始化也需要在类外完成,定义时不添加static关键字,类中只是声明。
  3. 可以直接使用类名调用静态成员函数,而不需要创建类的实例。
  4. 类静态成员可用 类名::静态成员 或者 对象.静态成员 来访问。
  5. 静态成员函数没有隐藏的this指针,不能访问任何非静态成员。
  6. 静态成员也是类的成员,受public、protected、private 访问限定符的限制。

     7.  静态成员函数无法调用非静态成员。

       非静态成员变量或非静态成员函数是属于类的实例的,需要通过实例对象来访问,但是静态成员函数中没有隐式的指向实例对象的this指针,故静态成员函数不可调用非静态成员函数 :

        如果静态成员函数需要访问非静态成员,可以考虑将非静态成员作为参数传入静态成员函数中。


【面试题】

1. 静态成员函数可以调用非静态成员函数吗?

        不可以。非静态成员需要通过实例对象来访问。


2. 非静态成员函数可以调用类的静态成员函数吗?

        可以。静态成员函数可以直接通过类来调用,不需要通过实例对象。


【总结】 



------------------------END-------------------------

才疏学浅,谬误难免,欢迎各位批评指正。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

烛火萤辉

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值