345 字
2 分钟
C++入门 (六) : C++中的静态
类内和类外static的区别
| 类外 | 类内 |
|---|---|
| 修饰的符号在 link 阶段是局部的,只对定义它的编译单元(.obj)可见 | 这部分内存是这个类的所有实例共享的,多次实例化,static 变量也只会有一个实例(见下篇) |
类和结构体外的static
静态变量存储在静态存储区中,而不是栈或堆上。它们在程序的整个执行期间都存在,并且只有一个实例。
static 变量或函数表示只在该translation unit中有效,链接器不会再去外面找他的定义,有点像类的private属性
\\ Static.cppstatic int s_Variable = 5; // s stands for static
\\ Main.cpp#include <iostream>
int s_Variable = 10;
int main(){ std::cout << s_Variable << std::endl; // 10 std::cin.get();}\\ Static.cppint s_Variable = 5; // remove static
\\ Main.cpp#include <iostream>
int s_Variable = 10;
int main(){ std::cout << s_Variable << std::endl; // LNK ERROR already defined in Main.obj std::cin.get();}所以两个全局变量的名字不能一样
解决方案 1: extern link
extern会在另外的编译单元里找 s_variable 的定义
\\ Static.cppint s_Variable = 5;
\\ Main.cppextern int s_Variable; // 它是变量的引用
std::cout << s_Variable << std::endl; // 5总结
在类或结构体的外部使用static修饰变量和函数,会让他们拥有不被外部翻译单元链接的能力。少用全局变量,这可能造成代码混乱。
C++入门 (六) : C++中的静态
https://dingfengbo.vercel.app/posts/c入门/06-c中的静态/