c++——静态成员变量、静态成员函数和const修饰的静态成员变量

一、c++静态成员变量

在C++中,静态成员变量(Static Member Variable)是类的一种特殊类型的成员变量,它被类的所有实例共享,而不是每个实例都有自己的副本。静态成员变量在类的所有对象之间保持唯一的状态,具有一些特殊的用途和语法。

1、概念:

静态成员变量是类的成员变量,但不是依赖于类的实例而存在的。它在类的所有实例之间共享相同的内存位置,因此在类的所有对象之间保持唯一的状态。
静态成员变量在类的声明中使用static关键字来定义,并在类的实现文件中进行初始化换句话说就是不能在类中进行初始化)。

2、使用方法:

①、声明静态成员变量:
在类的声明中,使用static关键字声明静态成员变量。声明通常在类的public、private或protected部分。

②、初始化静态成员变量:(不能在类里面进行初始化)
静态成员变量需要在类的实现文件中进行初始化。在类外部,使用类名和作用域解析操作符::来初始化静态成员变量。

③、访问静态成员变量:
静态成员变量不属于类的实例,因此可以使用类名和作用域解析操作符来访问,也可以在类的成员函数中通过this指针访问。

案例:

#include <iostream>
using namespace std;
class MyClass {
    
    
   public:
    /*
     *声明静态成员变量
     *静态成员变量在编译阶段就已经分配了内存,存在全局静态区
     */
    static int staticVar;

    MyClass() {
    
    
        // 在构造函数中修改静态成员变量
        staticVar++;
    }

    // 静态成员函数,用于访问静态成员变量
    static void printStaticVar() {
    
    
        cout << "Static variable value: " << staticVar << endl;
    }
};

// 初始化静态成员变量
int MyClass::staticVar = 0;//在类外初始化

int main() {
    
    
    MyClass obj1;
    MyClass::printStaticVar();  // 访问静态成员变量

    MyClass obj2;
    MyClass::printStaticVar();  // 访问静态成员变量

    return 0;
}

3、总结

在这里插入图片描述
①静态成员变量在内存中只有一份,多个对象共享一个静态变量
②静态成员变量,必须类内声明,类外定义
③静态成员变量可以通过类的作用域访问
④静态成员变量可以通过类的对象访问

二、静态成员函数

1、概念:

静态成员函数(Static Member Function):
静态成员函数是不依赖于类的实例的成员函数。它们可以通过类名和作用域解析操作符::直接访问。静态成员函数不能访问非静态成员变量,也不能使用this指针。

2、特点:

①静态成员函数能访问静态成员变量不能访问普通的成员变量
②可以通过类的作用域访问静态成员函数
③可以通过对象访问静态成员函数

案例代码

#include <iostream>
using namespace std;
class MyClass {
    
    
   private:
    int regularVar;        // 普通成员变量
    static int staticVar;  // 静态成员变量

   public:
    MyClass(int regValue, int statValue) : regularVar(regValue) {
    
    
        staticVar = statValue;
    }

    static void staticFunction() {
    
    
        // 静态成员函数可以访问静态成员变量,但不能访问普通成员变量
        cout << "Static member function accessing staticVar: " << staticVar
             << endl;
        // 下面一行会引发编译错误,因为静态函数不能访问普通成员变量
        // cout << "Static member function accessing regularVar: " <<
        // regularVar << endl;
    }

    void regularFunction() {
    
    
        cout << "Regular member function accessing regularVar: " << regularVar
             << endl;
    }
};

// 初始化静态成员变量
int MyClass::staticVar = 0;

int main() {
    
    
    // 使用类的作用域访问静态成员函数
    MyClass::staticFunction();

    MyClass obj(42, 100);
    obj.regularFunction();

    // 通过对象访问静态成员函数
    obj.staticFunction();  // 也可以通过对象访问,但是不推荐,最好使用类名访问

    return 0;
}

三、const修饰的静态成员变量

①const修饰的静态成员变量保存在常量区,只读的,在内存中只有一份
②const修饰的静态成员变量可以在类内定义且初始化
③const修饰的静态成员变量可以通过类的作用域访问
④const修饰的静态成员变量可以通过对象访问
⑤静态成员函数可以访问const修饰的静态成员变量

代码案例:

#include <iostream>
using namespace std;

class MyClass {
    
    
   public:
    // 在类内部定义且初始化带有const修饰的静态成员变量
    static const int staticConstVar = 42;

    static void printStaticConstVar() {
    
    
        // 静态成员函数可以访问const修饰的静态成员变量
        cout << "Static const variable value: " << staticConstVar << endl;
    }
};

int main() {
    
    
    // 通过类的作用域访问const修饰的静态成员变量
    cout << "Accessing via class scope: " << MyClass::staticConstVar << endl;

    // 通过对象访问const修饰的静态成员变量
    MyClass obj;
    cout << "Accessing via object: " << obj.staticConstVar << endl;

    // 调用静态成员函数,访问const修饰的静态成员变量
    MyClass::printStaticConstVar();

    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_57737603/article/details/132372277