静态成员在初始化时为什么前面不能加上static

静态成员在类内声明时加上了static
但是为什么在类外初始化时不能加上static

在类内声明静态成员时加上static关键字是为了标识它是一个类级别的静态变量,而不是对象级别的变量。在类外初始化静态成员时不能加上static关键字,因为在类外定义的变量默认为全局变量,不需要再加上static关键字。需要通过使用类名来限定该静态变量的作用域,例如:

class MyClass
{
public:
    static int myStaticVar;
};

int MyClass::myStaticVar = 0;

上面这段代码,在类内定义了一个静态变量myStaticVar,并在类外通过类名限定其作用域,对其进行初始化。

  • 文章:static成员函数不可以直接访问成员变量和普通函数可以访问静态变量以及内存分配详解 中也许有你想要的答案,请看下吧
  • 除此之外, 这篇博客: 静态全局函数、静态成员函数及静态成员变量的声明与使用中的 二、静态成员函数:类中的成员函数 + static限制 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • class A
    {
    public:
    	static void func();
    	static int a;
    }
    
    // 静态成员函数及变量:类内声明,类外实现
    void A::func(){}
    int A::a = 100;
    

    1、在类中,用static声明的成员变量为静态成员变量,它为该类的公用变量,在第一次使用时被初始化,对于该类的所有对象来说,static成员变量只有一份。如上例中的成员变量 a
    2、在类中的静态成员函数,只能访问类中的静态成员变量
    3、可以通过对象引用或类名(不需要实例化)访问静态成员。

    // 通过类名访问静态成员函数和静态成员变量
    A::func();	
    A::a;
    

    以下是完整代码:

    
    #include <iostream>
    using namespace std;
    
    class Aaa
    {
    public:
        static void func();
        static int a;
    };
    
    // 静态成员函数:类内声明,类外实现
    void Aaa::func()
    {
        cout << "It's func()" << endl;
    }
    
    // 静态成员变量:类内声明,类外实现
    int Aaa::a = 100;
    
    // 全局静态函数:其他文件中不能引用
    static void GlobalFunc()
    {
        cout << "It's global static func!" << endl;
    }
    
    int main()
    {
        Aaa::func(); // 使用类名访问静态成员函数
        cout << "a = " << Aaa::a << endl; // 使用类名访问静态成员变量
        GlobalFunc();
        return 0;
    }
    

    谢谢阅读