目录
一、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成员的作用:
共享数据:static成员变量是类的所有实例共享的,它们在所有类的实例之间保持一致。这意味着无论创建多少个类的实例,它们都共享相同的static成员变量。这对于需要在类的所有实例之间共享数据的情况非常有用。
类级别操作:static成员函数是类的成员函数,而不是实例的成员函数。它们可以在没有类实例的情况下被调用,因为它们不依赖于任何特定的实例数据。这使得它们能够执行类级别的操作,例如访问和修改只与类有关的数据(例如类的计数器)。
避免重复定义:static成员变量和函数可以用来避免重复定义。它们只在类的定义文件中声明一次,而不是在每个实例中定义。
实现单例模式:
static
成员在实现单例设计模式时非常有用。单例模式确保一个类只有一个实例,并提供一个全局访问点来获取该实例。这通常是通过使用static
成员(如静态实例指针和静态获取实例的方法)来实现的。
三、怎么使用static成员?
1. 定义static成员变量
以下是定义
static
成员变量的步骤和示例:
在类声明中声明
static
成员变量。(类内要写static)在类外部使用类名加作用域限定符::来初始化、访问和修改
static
成员变量。(类外不需要写static)class A{ private:static int count; };int A::count = 0;
2. 定义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使其成为内联函数。
3. 访问static成员
类静态成员可用 类名::静态成员 或者 对象.静态成员 来访问:
class A{ public:static void P1(){cout << 1 << endl;}static int a; };int A::a = 0;int main() {// 静态成员可以直接不创建对象直接通过类来访问:A::a = 1;A::P1();// 静态成员也可以通过对象来访问:A b;b.P1();b.a;return 0; }
四、特性
- 静态成员为所有类对象所共享,不属于某个具体的对象,存放在静态区。
- 静态成员变量必须在类外定义,初始化也需要在类外完成,定义时不添加static关键字,类中只是声明。
- 可以直接使用类名调用静态成员函数,而不需要创建类的实例。
- 类静态成员可用 类名::静态成员 或者 对象.静态成员 来访问。
- 静态成员函数没有隐藏的this指针,不能访问任何非静态成员。
- 静态成员也是类的成员,受public、protected、private 访问限定符的限制。
7. 静态成员函数无法调用非静态成员。
非静态成员变量或非静态成员函数是属于类的实例的,需要通过实例对象来访问,但是静态成员函数中没有隐式的指向实例对象的this指针,故静态成员函数不可调用非静态成员函数 :
如果静态成员函数需要访问非静态成员,可以考虑将非静态成员作为参数传入静态成员函数中。
【面试题】
1. 静态成员函数可以调用非静态成员函数吗?
不可以。非静态成员需要通过实例对象来访问。
2. 非静态成员函数可以调用类的静态成员函数吗?
可以。静态成员函数可以直接通过类来调用,不需要通过实例对象。
【总结】
------------------------END-------------------------
才疏学浅,谬误难免,欢迎各位批评指正。