static关键字总结-C/C++

8 篇文章 0 订阅

引言:由于怕忘记static的一些区别,今天来写一篇文章尽可能的覆盖到static在C/C++中的用法和易错点。

第一部分  C中的static

1. static修饰变量 

被修饰的变量只能被定义一次,如下代码,n经过循环后仍然还是10。

#include <stdio.h>
int main() {
	static int n = 10;
	for (int i = 0; i < 10; i++) {
		int n = 10 + i;
	}
	printf("n:%d", n);
	return 0;
}

 

2. static修饰全局变量

  • 静态全局变量被存储在数据区的 静态区(数据段)。
  • 静态全局变量链接属性变为内部链接作用域因此被限制在本文件,变量只可在本文件中被访问。
test.c
static int a = 0;
main.c
#include <stdio.h>
extern int a;
int main() {
	printf("a:%d\n", a);
	return 0;
}

 这里就会编译器就会报错,其在链接时,无法解析外部符号a.

3. static修饰函数

 与静态全局变量相似,静态函数为内部链接,只能在声明它的文件中被调用。 

 第二部分  C++中的static

1.  修饰类的成员函数

可以看出:编译器报错了,因为被静态修饰的成员函数无法访问除静态成员变量的成员变量。(它的形参少了一个this指针)

可以访问静态成员变量h 

2.  修饰类的成员变量 

上面,我们在Date 类中声明了一个static int h,但是C++规定,静态成员变量在类中只能声明,需要在类外面去初始化

 同时C++11规定除静态成员变量外,其他成员变量可以在类中声明并初始化,如下:

 访问静态成员变量同样需要突破类域和访问限定符。即不可以下面这样!

 

3. 修饰类的成员常量 

在上一篇实现string的文章中, 我们定义了一个静态成员常量 npos

class string{
public:
  typedef char* iterator; 
//
//
//
private:
  char* _str; // 用于保存字符串
  int _size; // 字符串长度
  int _capacity; // 容量
  static const size_t npos = -1; // 表示找不到
};

你可能会有疑问为啥这个可以在类中进行定义,好问题!

因为这是C++的规定,允许整型const static 可以在类的定义体中定义并初始化。另外,由于字符型其实就是整型,所以它也可以在类中进行定义初始化。

 ​​​

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值