C++11新特性 5.static静态
目录
一.简介
1.基本概念
2.语法
(1)静态局部变量
(2) 静态成员变量
(3)静态成员函数
二.使用示例
示例1:静态局部变量
示例2:静态成员变量
示例3:静态成员函数
示例4:在 C++11 新特性中的应用
示例5:静态全局变量和函数
一.简介
1.基本概念
在 C++ 中,static
是一个用途广泛的关键字,它主要用于控制变量和函数的存储方式、生命周期和作用域。static
关键字在不同的上下文中有不同的含义,核心思想是将变量或函数的作用范围限制在特定的区域内,并且在程序的整个生命周期内保持其存在和状态。
在 C++11 中,static
关键字延续了其在 C++ 早期版本中的一些重要特性,同时也在一些新特性的语境下有着特定的应用。
2.语法
(1)静态局部变量
void function() {
static 数据类型 变量名 = 初始值;
// ...
}
(2) 静态成员变量
class ClassName {
public:
static 数据类型 变量名; // 类内声明
// ...
};
数据类型 ClassName::变量名 = 初始值; // 类外定义和初始化
(3)静态成员函数
class ClassName {
public:
static 返回类型 函数名(参数列表);
// ...
};
返回类型 ClassName::函数名(参数列表) {
// 函数体
}
二.使用示例
示例1:静态局部变量
当 static
用于修饰局部变量时,该变量被称为静态局部变量。静态局部变量在函数第一次调用时初始化,之后每次调用函数时不会再次初始化,而是保留上一次调用结束时的值。
#include <iostream>
void showCount() {
static int count = 0; // 静态局部变量,仅初始化一次
std::cout << "Count: " << count << std::endl;
count++;
}
int main() {
showCount(); // 输出: Count: 0
showCount(); // 输出: Count: 1
return 0;
}
注意事项:
静态局部变量的生命周期是整个程序运行期间,但其作用域仍然局限于定义它的函数内部。
示例2:静态成员变量
在类中使用 static
修饰的成员变量称为静态成员变量。静态成员变量属于类本身,而不是类的某个对象,所有对象共享同一个静态成员变量。
#include <iostream>
class MyClass {
public:
static int staticVar; // 静态成员变量声明
};
// 静态成员变量定义和初始化
int MyClass::staticVar = 10;
int main() {
MyClass obj1, obj2;
std::cout << "obj1.staticVar: " << obj1.staticVar << std::endl; // 输出: obj1.staticVar: 10
std::cout << "obj2.staticVar: " << obj2.staticVar << std::endl; // 输出: obj2.staticVar: 10
MyClass::staticVar = 20; // 可以通过类名直接访问和修改静态成员变量
std::cout << "obj1.staticVar: " << obj1.staticVar << std::endl; // 输出: obj1.staticVar: 20
std::cout << "obj2.staticVar: " << obj2.staticVar << std::endl; // 输出: obj2.staticVar: 20
return 0;
}
注意事项:
1.静态成员变量必须在类外部进行定义和初始化,除非它是const static
类型且为整数类型(如 int
、char
等),可以在类内部初始化。
2.可以通过类名或对象名访问静态成员变量。
示例3:静态成员函数
使用 static
修饰的类成员函数称为静态成员函数。静态成员函数同样属于类本身,不依赖于类的具体对象,可以直接通过类名调用。
#include <iostream>
class MyClass {
public:
static int staticVar;
static void staticFunc() {
std::cout << "Static variable value: " << staticVar << std::endl;
}
};
int MyClass::staticVar = 10;
int main() {
MyClass::staticFunc(); // 可以直接通过类名调用静态成员函数
return 0;
}
注意事项:
1.静态成员函数只能访问静态成员变量和其他静态成员函数,不能访问非静态成员变量和非静态成员函数,因为静态成员函数不与任何具体对象关联,没有 this
指针。
2.静态成员函数可以在不创建对象的情况下调用,这在一些工具类或全局功能封装中非常有用。
示例4:在 C++11 新特性中的应用
在 Lambda 表达式中:虽然 static
本身不是 Lambda 表达式的新特性,但在 Lambda 表达式中可以使用静态局部变量。
#include <iostream>
int main() {
auto lambda = []() {
static int count = 0;
std::cout << "Lambda count: " << count << std::endl;
count++;
};
lambda(); // 输出: Lambda count: 0
lambda(); // 输出: Lambda count: 1
return 0;
}
在这个 Lambda 表达式中,static int count
是一个静态局部变量,每次调用 Lambda 表达式时,它会保留上一次的值。
示例5:静态全局变量和函数
// file1.cpp
#include <iostream>
static int staticGlobalVar = 10; // 静态全局变量
static void staticFunction() { // 静态全局函数
std::cout << "Static global variable: " << staticGlobalVar << std::endl;
}
// file2.cpp
// 无法访问 file1.cpp 中的 staticGlobalVar 和 staticFunction
int main() {
staticFunction(); // 输出: Static global variable: 10
return 0;
}
注意事项:
静态全局变量和函数具有内部链接属性,只能在定义它们的文件中被访问,这有助于避免不同文件中同名变量或函数的冲突。不过,在现代 C++ 中,更推荐使用匿名命名空间来实现相同的功能。