玩命加载中 . . .

static关键字


静态变量

函数中使用static

当变量声明为static时,变量空间将在程序的生命周期内分配。即使多次调用该函数,静态变量的空间也『只分配一次』,前一次调用中的变量值通过下一次函数调用传递。这对于在C/C++或需要存储先前函数状态的任何其他应用程序非常有用

void demo() {
    static int count = 0;
    cout << count << " "; 
    count++; 
} 

int main() { 
    for (int i = 0; i < 5; i++)
        demo(); 
    return 0; 
}
0 1 2 3 4

可以看到count在不断累加,static变量的空间只分配一次,每次调用之后不会再进行初始化

类中使用static

  • 类中的static变量只能声明,定义要放在类外面

由于声明为static的变量只被初始化一次,因为它们在单独的静态存储中分配了空间,因此类中的静态变量『由对象共享』。对于不同的对象,不能有相同静态变量的多个副本。也是因为这个原因,静态变量不能使用构造函数初始化

class Human {
public:
    static int ip;  // 类中声明static变量
private:
    string _name;
    int _age;
};

int Human::ip = 0;  // 类外定义static变量

int main(int argc, char const *argv[]) {
    Human kavin("kavin", 23);
    cout << kavin.ip << endl;   // 0
    kavin.ip = 10;

    Human* jack = new Human("jack", 12);
    jack->ip = 30;

    cout << kavin.ip << endl;   // 30
    return 0;
}

可以看到不同对象都可以对static变量进行修改,他们是共享的

静态变量需要初值

在C++11标准下,static搭配const就可以在类内初始化

class A {
    static const int num = 5;
    // 或者 enum { num = 5 };
    int arr[num];
};

这里数组必须知道大小,所以就必须在给num赋初值
也可以用enum

静态成员

类对象为静态

先看看非静态对象的效果

int main(int argc, char const *argv[]) {
    int x = 1;
    if (x == 1) {
        int num1 = 100;
        Human kavin("kavin", 23, num1);
    }
    cout << "main function end" << endl;
    return 0;
}
Destructor: delete ptr
main function end

因为kavin对象的生命周期在if语句结束之后就结束了,所以就会调用析构函数

如果将对象声明为静态

int main(int argc, char const *argv[]) {
    int x = 1;
    if (x == 1) {
        int num1 = 100;
        static Human kavin("kavin", 23, num1);
    }
    cout << "main function end" << endl;
    return 0;
}
main function end
Destructor: delete ptr  // main结束后才调用析构函数

静态对象的声明周期贯穿整个程序,所以在程序结束之后才会调用析构函数

类中的静态函数

就像类中的静态数据成员或静态变量一样,静态成员函数也不依赖于类的对象。我们被允许使用对象和.来调用静态成员函数

  • 建议使用类名和范围解析运算符调用静态成员
  • 静态成员函数仅能访问静态数据成员或其他静态成员函数,它们无法访问类的非静态数据成员或成员函数。
class Human {
public:
    static int ip;
    static void info();
};

int Human::ip = 0;

void Human::info() {
    cout << ip << endl;
    // Introduce();    //error,不能调用非静态成员函数
}

int main(int argc, char const *argv[]) {
    Human kavin("kavin", 23);
    kavin.ip = 10;
    Human::info();  // 10
    return 0;
}

文章作者: kunpeng
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 kunpeng !
  目录