static 关键字

发布时间 2023-11-16 18:37:17作者: K1øN
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

https://zhuanlan.zhihu.com/p/348026261

讨论 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来访问静态成员
    • 使用 :: 来访问而不是 .