📅  最后修改于: 2023-12-03 15:28:52.743000             🧑  作者: Mango
静态 (static) 是 C++ 中一个简单但又十分重要的修饰符,应用广泛。本文将介绍静态修饰符在 C++ 中的用法、意义以及代码演示。
在 C++ 类中,可以声明静态成员变量。它们在内存中只有一份拷贝,与类的实例无关。在声明时,需要在变量前加上 static
关键字。静态成员变量可以通过类名直接访问,也可以通过对象访问。
下面是一个例子:
#include <iostream>
using namespace std;
class MyClass {
public:
static int static_var;
int non_static_var;
};
int MyClass::static_var = 0;
int main() {
MyClass obj1, obj2;
obj1.static_var = 1;
obj1.non_static_var = 2;
obj2.static_var = 3;
obj2.non_static_var = 4;
cout << "obj1: static_var = " << obj1.static_var << ", non_static_var = " << obj1.non_static_var << endl;
cout << "obj2: static_var = " << obj2.static_var << ", non_static_var = " << obj2.non_static_var << endl;
cout << "MyClass: static_var = " << MyClass::static_var << endl;
return 0;
}
输出:
obj1: static_var = 3, non_static_var = 2
obj2: static_var = 3, non_static_var = 4
MyClass: static_var = 3
从输出可以看出,这里每次改变静态变量的值,对所有实例都是影响的。
静态成员函数与静态成员变量的用法类似,也是只有一个拷贝,与类的实例无关。静态成员函数可以通过类名直接调用,不需要对象。
下面是一个例子:
#include <iostream>
using namespace std;
class MyClass {
public:
static void static_func() {
cout << "This is a static function." << endl;
}
void non_static_func() {
cout << "This is a non-static function." << endl;
}
};
int main() {
MyClass::static_func(); // 调用静态函数
MyClass obj;
obj.non_static_func(); // 调用非静态函数
return 0;
}
输出:
This is a static function.
This is a non-static function.
在函数内部定义的变量称为局部变量。有时候需要在函数内部定义一个变量,希望它的值在函数调用间保持不变。这时可以使用静态变量,即在变量前加上 static
关键字。
下面是一个例子:
#include <iostream>
using namespace std;
void func() {
static int static_var = 0;
int non_static_var = 0;
static_var++;
non_static_var++;
cout << "static_var = " << static_var << ", non_static_var = " << non_static_var << endl;
}
int main() {
func();
func();
func();
return 0;
}
输出:
static_var = 1, non_static_var = 1
static_var = 2, non_static_var = 1
static_var = 3, non_static_var = 1
从输出可以看出,这里静态变量 static_var
的值在函数调用之间保持不变。
静态 assert 断言是指在编译时检查某种条件是否成立,并在不成立时产生编译错误。这种断言适用于一些简单的条件检查。
静态 assert 断言的语法为:
static_assert(expression, message_opt);
其中 expression
是需要检查的条件,message_opt
是可选的错误信息。
下面是一个例子:
#include <iostream>
#include <type_traits>
using namespace std;
template<typename T>
void func(T t) {
static_assert(is_integral<T>::value, "Not integral type.");
cout << t << endl;
}
int main() {
func(123);
// func(123.456); // 编译错误:Not integral type.
return 0;
}
从输出可以看出,这里在调用 func
函数时,如果传入的类型不是整型,就会产生编译错误。
静态关键字在 C++ 中应用广泛,包括静态成员变量、静态成员函数、静态局部变量和静态 assert 断言等等。掌握这些用法,对于 C++ 程序员来说十分重要。