title: static keyword
layout: page
categories: cpp
static
keyword
编译器信息:
╰─>$ clang++ --version
Apple clang version 15.0.0 (clang-1500.0.40.1)
Target: arm64-apple-darwin23.1.0
Thread model: posix
InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin
https://en.cppreference.com/w/cpp/language/static (最全——但是记不住)
https://learn.microsoft.com/en-us/cpp/cpp/storage-classes-cpp?view=msvc-170
讨论 static
修饰四种变量的情况:
全局变量
- Internal linkage, 内部链接,
- 仅能在当前文件 (translation unit) 内部访问;
- 初始化为 0 , 除非另有指定;
- 存储在 data segment 上,既不是 stack 也不是 heap;
https://upload.wikimedia.org/wikipedia/commons/5/50/Program_memory_layout.pdf
指针
全局指针
static int* uninitialized_ptr;
int main() {
Widget wid;
print(uninitialized_ptr);
return 0;
}
Address: 0x0
局部指针
int main() {
static int* uninitialized_ptr;
print(uninitialized_ptr);
return 0;
}
Address: 0x0
类
类中的静态成员函数
功能上,以下两种写法没有什么区别:
class Widget {
public:
static void someFunction();
static void otherFunction();
};
namespace Widget {
void someFunction();
void otherFunction();
}
类中的静态成员
- 只会有一份拷贝,无论创建多少对象,都只会有一个副本;
- 要求初始化,否则报错
class Widget {
public:
static int data;
static int* some_ptr;
};
int Widget::data = 0;
// int* Widget::some_ptr = &some_val;
ld: Undefined symbols:
Widget::some_ptr, referenced from:
_main in test-b2d8d2.o
clang: error: linker command failed with exit code 1 (use -v to see invocation)
- 初始化的时候就不需要
static
关键字了 - 严格上表现得不像是一个「成员」,因为
- 不可以调用
this
来访问静态成员 - 使用
::
来访问而不是.
- 不可以调用