- static:
- 静态变量(static variable):在函数内部声明的静态变量在程序执行期间保持其值,而不会在函数调用结束后销毁。静态变量只初始化一次,然后可以在后续函数调用中使用其最新值。
void foo() {
static int counter = 0;
counter++;
cout << "Counter: " << counter << endl;
}
int main() {
foo(); // 输出:Counter: 1
foo(); // 输出:Counter: 2
return 0;
}
- 上述代码中,静态变量
counter在每次调用foo()时保持其值,并在每次调用后递增。- 静态函数(static function):在类中声明的静态函数与类的对象实例无关,可以直接通过类名访问。静态函数不能访问非静态成员变量,因为它们没有this指针。
class MathUtils {
public:
static int add(int a, int b) {
return a + b;
}
};
int main() {
int result = MathUtils::add(3, 5);
cout << "Result: " << result << endl; // 输出:Result: 8
return 0;
}
在上述代码中,
add()函数是一个静态函数,我们可以直接使用MathUtils::add()进行调用。const:
- 常量变量(const variable):用
const修饰的变量表示其值在程序执行期间是不可修改的。
常量必须在声明时进行初始化,并且不能在后续代码中修改其值。
- 常量变量(const variable):用
int main() {
const int MAX_VALUE = 100;
// MAX_VALUE = 200; // 错误,不能修改常量的值
cout << "Max value: " << MAX_VALUE << endl; // 输出:Max value: 100
return 0;
}
- 在上述代码中,
MAX_VALUE被声明为常量,一旦初始化后,其值将保持不变。- 常量引用(const reference):用
const修饰的引用参数表示函数不会修改传入的参数值。
- 常量引用(const reference):用
void printMessage(const string& message) {
cout << "Message: " << message << endl;
}
int main() {
string greeting = "Hello!";
printMessage(greeting); // 输出:Message: Hello!
return 0;
}
在上述代码中,printMessage()函数接受一个常量引用参数message,保证函数内部不会修改greeting的值。
总结:
static用于创建静态变量和静态函数,静态变量在程序执行期间保持其值,静态函数与类的对象实例无关。const用于创建常量变量和常量引用,常量变量的值在初始化后不可修改,常量引用表示函数不会修改传入的参数值。
static和const在类中的应用:
const:
在C++中,const成员变量的初始化需要在类的构造函数初始化列表(constructor initialization list)中进行,而不能在构造函数的函数体内进行赋值操作。
以下是一个示例代码,演示了如何初始化const成员变量:
class MyClass {
private:
const int myConstant;
public:
// 构造函数
MyClass(int value) : myConstant(value) {
// 在构造函数的初始化列表中对const成员变量进行初始化
// 可以使用参数或者其他表达式来赋值给const成员变量
// 构造函数的函数体内不能对const成员变量赋值
}
void printConstant() {
cout << "Constant value: " << myConstant << endl;
}
};
int main() {
MyClass obj(42);
obj.printConstant(); // 输出:Constant value: 42
return 0;
}
在上述代码中,MyClass类有一个私有的const成员变量myConstant。构造函数MyClass(int value)中,在构造函数的初始化列表中使用参数value来初始化myConstant。
注意,在构造函数的函数体内不能对const成员变量进行赋值操作,因此必须使用构造函数的初始化列表来进行初始化。
通过这种方式,可以在创建对象时将值传递给const成员变量,并在对象的生命周期内保持其不变性。
static:
在C++中,静态成员变量(static member variables)需要在类外进行初始化。初始化可以在类定义的外部进行,通常在类的实现文件(.cpp)中进行。这样做是因为静态成员变量属于整个类而不是特定的对象实例,因此需要在类的定义之外进行初始化。
以下是一个示例代码,演示了如何初始化静态成员变量:
class MyClass {
public:
static int staticVariable;
};
// 静态成员变量的初始化
int MyClass::staticVariable = 10;
int main() {
cout << "Static variable: " << MyClass::staticVariable << endl; // 输出:Static variable: 10
return 0;
}
在上述代码中,MyClass类有一个公有的静态成员变量staticVariable。在类的定义外部,通过MyClass::staticVariable = 10;的方式进行初始化。这样,所有属于MyClass类的对象实例都共享同一个静态成员变量。
可以通过类名和作用域解析运算符::来访问静态成员变量,如MyClass::staticVariable。
需要注意的是,静态成员变量的初始化只能在类外进行一次。如果在类的多个源文件中都包含了该静态成员变量的初始化语句,将导致重复定义错误。通常,将静态成员变量的初始化放在类的实现文件中,并在头文件中声明静态成员变量的存在。
静态局部变量:
在 C++ 中,静态局部变量(static local variables)是在函数内部声明的静态变量。与函数内的普通局部变量不同,静态局部变量在函数的多次调用之间保持其值,并且仅在第一次进入声明该变量的代码行时进行初始化。
静态局部变量的初始化只发生一次,以后每次进入声明该变量的作用域时,都不会重新初始化,而是保留上一次的值。
下面是一个示例代码,演示了静态局部变量的用法:
#include <iostream>
void foo() {
static int counter = 0;
counter++;
std::cout << "Counter: " << counter << std::endl;
}
int main() {
foo(); // 输出:Counter: 1
foo(); // 输出:Counter: 2
foo(); // 输出:Counter: 3
return 0;
}
在上述代码中,foo()函数内部声明了一个静态局部变量counter。在每次调用foo()时,counter的值都会递增,并在每次调用之间保留其值。这是因为静态局部变量在函数的多次调用之间保持其状态。
静态局部变量的初始化只在第一次进入声明它的代码行时进行,之后的函数调用不会再次初始化它。这就是为什么在示例代码中的后续调用中,counter的值在前一次调用的基础上递增。
请注意,静态局部变量的生命周期与程序运行期间一致,但其作用域仅限于声明它的函数内部。这意味着其他函数无法直接访问该静态局部变量。

