C++关键字 · 2021年7月22日 0

static

静态关键字和不同类型一起使用时具有不同的含义

静态变量

单独的静态变量

当一个变量被声明为静态时,它的空间会在程序的生命周期内分配。即使多次调用该函数,静态变量的空间也只分配一次,并且上一次调用中的变量值会通过下一次函数调用进行。

这对于在 C/C++或任何其他需要存储函数先前状态的应用程序中实现协程很有用。

类中的静态变量

由于声明为静态的变量只初始化一次,因为它们在单独的静态存储中分配了空间,因此类中的静态变量由对象共享。在类之外主函数中可以声明同名变量,因为原来的变量是在类中的。

对于不同的对象,不能有多个相同静态变量的副本。也因为这个原因静态变量不能使用构造函数初始化

 #include<iostream>
 using namespace std;
 ​
 class test_class_static{
  public :
  static int i;
  GfG(){};
 }
 ​
 int test_class_static::i=5;//初始化格式
 ​
 int main(){
  GfG obj1;
  GfG obj2;
  cout<<obj.i<<' '<<obj.i<<"\n";
 }
 //输出为
 5 5
 ​

1.静态数据成员不能在类定义中初始化,也不能在main函数里面初始化,一般在类外和main()函数之前初始化。

2.static成员的所有者是类本身,但是多个对象拥有一样的静态成员。从而在定义对象是不能通过构造函数对其进行初始化。

3.静态变量仍然遵循public,private,protected访问准则。

类对象作为静态

 class GfG
 {
     int i = 0;
       
     public:
     GfG()
    {
         i = 0;
         cout << "Inside Constructor\n";
    }
       
     ~GfG()
    {
         cout << "Inside Destructor\n";
    }
 };
   
 int main()
 {
     int x = 0;
     if (x==0)
    {
         static GfG obj;
    }
     cout << "End of main\n";
 }

输出为

 Inside Constructor
 End of main
 Inside Destructor
 ​

main 结束后调用析构函数。发生这种情况是因为静态对象的范围贯穿程序的整个生命周期。

类的静态成员函数

就像类内部的静态数据成员或静态变量一样,静态成员函数也不依赖于类的对象

我们可以使用对象和“.”来调用静态成员函数。运算符,但建议使用类名和作用域解析运算符调用静态成员。

静态成员函数只能访问静态数据成员或其他静态成员函数,不能访问类的非静态数据成员或成员函数

 class GfG
 {
    public:
       
     // static member function
     static void printMsg()
    {
         cout<<"Welcome to GfG!";
    }
 };
   
 // main function
 int main()
 {
     // invoking a static member function
     GfG::printMsg();
 }