📜  C ++ |静态关键字|问题1(1)

📅  最后修改于: 2023-12-03 14:59:36.960000             🧑  作者: Mango

C++ | 静态关键字 | 问题1

C++ 中的静态关键字用于声明静态变量(static variable)和静态函数(static function)。静态变量与普通变量不同,它的生命周期在程序运行期间都存在,在程序运行期间变量只会被初始化一次。静态函数与普通函数的区别在于,静态函数只能在当前文件中访问,而普通函数可被其他文件访问。

静态变量

静态变量在声明时需要加上 static 关键字。它可以被所有该变量所在的函数共享,作为该类的成员变量也可以被该类的所有对象共享。静态变量的初始化只会在程序运行期间第一次访问时进行,且在程序结束时才被销毁。

class MyClass {
public:
    static int count;  // 静态变量声明
};

// 静态变量定义
int MyClass::count = 0;

int main() {
    MyClass obj1, obj2, obj3;

    obj1.count = 1;
    cout << "obj1.count = " << obj1.count << endl;  // 输出:1
    cout << "obj2.count = " << obj2.count << endl;  // 输出:1
    cout << "obj3.count = " << obj3.count << endl;  // 输出:1

    obj2.count = 2;
    cout << "obj1.count = " << obj1.count << endl;  // 输出:2
    cout << "obj2.count = " << obj2.count << endl;  // 输出:2
    cout << "obj3.count = " << obj3.count << endl;  // 输出:2
    return 0;
}

由上述代码,我们可以看到,无论是通过 obj1、obj2、obj3 来访问静态变量 count 都会得到相同的结果。因此,当多个对象需要使用同一个计数器时,可以使用静态变量。静态变量不仅可以作为类的成员变量,也可以定义在函数内部。函数内部的静态变量只会在第一次调用函数时被初始化,且每当函数被调用时,该变量仍将保持其值而不会重置。

int func() {
    static int count = 0;
    return ++count;
}

int main() {
    cout << func() << endl;  // 输出:1
    cout << func() << endl;  // 输出:2
    cout << func() << endl;  // 输出:3
    return 0;
}
静态函数

静态函数在声明时需要加上 static 关键字。静态函数只能被同一类中的其他函数调用,而不能被其他文件中的函数调用。因此,静态函数常常被用作实现 helper 函数,在该类的其他函数中调用。

class MyClass {
private:
    int value;
public:
    MyClass(int v) : value(v) {}

    int getValue() const { return value; }  // 普通函数

    static int max(MyClass a, MyClass b) {   // 静态函数
        return a.getValue() > b.getValue() ? a.getValue() : b.getValue();
    }
};

int main() {
    MyClass obj1(3), obj2(5);
    cout << "The bigger value is: " << MyClass::max(obj1, obj2) << endl; // 输出:5
    return 0;
}

静态函数可不依赖于类的实例,因此,它不需要访问对象的成员变量即可完成任务。总的来说,静态函数与普通函数的区别还有:

  • 静态函数只能访问类的静态变量和其他静态函数,而不能访问该类的普通变量和普通函数。
  • 静态函数不能被声明为虚函数。