初识static关键字

一、static的作用

在C++中,static关键字是一个多功能的修饰符,它可以用于不同的上下文,并且具有不同的意义。

二、局部静态变量

在函数内部,如果你使用static关键字声明一个变量,那么这个变量只会初始化一次,并且它的生命周期会持续到程序结束

这意味着,即使在函数返回之后,这个变量的值也会被保留下来,并且在下次函数调用时仍然有效。

void func() 
{  
    static int count = 0; // 只在第一次调用时初始化  
    count++;  
    std::cout << "Count: " << count << std::endl;  
}

三、全局/命名空间静态变量

在文件的全局作用域或命名空间中,static关键字用于限制变量的可见性。一个静态全局变量或命名空间变量只在本文件中可见,不能被其他文件直接访问。这通常用于隐藏特定于文件的变量,或者为库提供内部状态。

// File1.cpp  
static int secret_value = 42; // 其他文件不能直接访问这个变量  
 
// File2.cpp  
// 这里不能直接访问secret_value,因为它是File1.cpp中的静态全局变量

四、静态成员函数和静态数据成员

静态成员函数:

  • 所有对象共享同一个函数。
  • 静态成员函数只能访问静态成员变量和其他静态成员函数
  • 在类定义中,静态成员函数不与类的任何特定实例关联。
  • 它们可以直接通过类名来调用,不需要创建类的实例
  • 没有this指针,因为它们是独立于类的任何特定对象的。
  • 只需在声明处出现一次static关键字,在类外定义的时候不需要重复。
class Test
{
    static void fun();
};

void Test::fun()
{
    cout << 10 << endl;
}
class Person
{
public:
    static int a;
    int b;
    static void fun()
    {
        a = 10;    //正确。
        b = 10;    //错误,静态成员函数只能访问静态数据成员,无法区分是哪个对象的b变量。
    }
};

静态数据成员:

  • 类内声明,类外初始化。
  • 编译阶段分配内存,并且直到程序结束才会释放。
  • 可以通过类名和作用域解析运算符(::)直接访问,也可以通过类的对象访问。
  • 所有对象共享同一份数据。
//类内声明,类外初始化。
class MyClass 
{  
public:  
    static int staticVar; // 静态成员变量  

    static void staticFunc() 
    {  
        //访问静态成员变量  
        std::cout << "Static variable: " << staticVar << std::endl;  
    }  

    void print()
    {
        //类的成员函数不需要::(作用域运算符)也可以直接访问
        std::cout << staticVar << endl;
    }
};  

int MyClass::staticVar = 0; 
// 静态成员变量需要在类外部定义,没有这部类外定义就报错。  

int main() 
{  
    MyClass::staticFunc(); // 直接通过类名调用静态成员函数  
    return 0;  
}

所有的对象都共享一份数据,修改一个,其他对象也会被修改。

//所有对象共享同一份数据
class Person
{
public:
    static int age;
};

int Person::age = 10;

void test()
{
    Person p1;
    cout << p1.age << endl;

    Person p2;
    p2.age = 20;
    cout << p1.age << endl;    //此处p1.age为20
}

int main()
{
    test();
    return 0;
}

因此静态成员有两种访问方式。

  • 通过对象名 + 变量名访问:如p1.age。
  • 通过类名 + 变量名访问:如Person:age。
posted @ 2024-05-25 00:32  baobaobashi  阅读(3)  评论(0编辑  收藏  举报