引言:由于怕忘记static的一些区别,今天来写一篇文章尽可能的覆盖到static在C/C++中的用法和易错点。
被修饰的变量只能被定义一次,如下代码,n经过循环后仍然还是10。
- #include
- int main() {
- static int n = 10;
- for (int i = 0; i < 10; i++) {
- int n = 10 + i;
- }
- printf("n:%d", n);
- return 0;
- }
- 静态全局变量被存储在数据区的 静态区(数据段)。
- 静态全局变量链接属性变为内部链接,作用域因此被限制在本文件,变量只可在本文件中被访问。
- test.c
- static int a = 0;
- main.c
- #include
- extern int a;
- int main() {
- printf("a:%d\n", a);
- return 0;
- }
这里就会编译器就会报错,其在链接时,无法解析外部符号a.
与静态全局变量相似,静态函数为内部链接,只能在声明它的文件中被调用。
可以看出:编译器报错了,因为被静态修饰的成员函数无法访问除静态成员变量的成员变量。(它的形参少了一个this指针)
可以访问静态成员变量h
上面,我们在Date 类中声明了一个static int h,但是C++规定,静态成员变量在类中只能声明,需要在类外面去初始化。
同时C++11规定除静态成员变量外,其他成员变量可以在类中声明并初始化,如下:
访问静态成员变量同样需要突破类域和访问限定符。即不可以下面这样!
在上一篇实现string的文章中, 我们定义了一个静态成员常量 npos
- class string{
- public:
- typedef char* iterator;
- //
- //
- //
- private:
- char* _str; // 用于保存字符串
- int _size; // 字符串长度
- int _capacity; // 容量
- static const size_t npos = -1; // 表示找不到
- };
你可能会有疑问为啥这个可以在类中进行定义,好问题!
因为这是C++的规定,允许整型const static 可以在类的定义体中定义并初始化。另外,由于字符型其实就是整型,所以它也可以在类中进行定义初始化。