【C++】static关键字

分为4部分:

  • static 修饰非成员变量和函数
    1. static 修饰非成员变量
    2. static 修饰非成员函数
  • static 修饰成员变量和函数
    1. static 修饰成员变量
    2. static 修饰成员函数

一、static 修饰非成员变量和函数

1.1 static 修饰非成员变量

  C/C++ 中,static 修饰的非成员变量分为静态全局变量静态局部变量,两种静态变量都是存储在全局区(静态区)。静态变量之初始化一次,未进行初始化的会默认初始化为0(数组也是默认都初始化为0)。
  静态全局变量只在本文件内可见,外部文件无法访问(可以说static起到了隐藏的作用)。
  静态局部变量只在定义的作用域内可见,但他们的生存周期和静态全局变量一样都是整个程序运行时期。

1.2 static 修饰非成员函数

  static 修饰的函数为静态函数,静态函数依旧是起到函数的隐藏作用,静态函数只允许在当前文件中使用,在其他文件中无法找到该函数的地址。比如在一个工程中创建两个 .cpp(.c)文件,test1、test2,在 test1 中定义一个 static int add() 函数并对该函数进行实现,而在 test2 中使用 add 函数是就编译会报错误,这就是由于 static 修饰该函数只允许在 test1 文件中使用造成的。

二、static 修饰成员变量和函数

2.1 static 修饰成员变量

  static 修饰的数据成员属于类的组成部分(不属于类的某个对象),static 修饰的数据成员不在栈上分配内存而在.data段分配内存(也就是和静态非成员变量一样存储在全局区),static 修饰的数据成员不能通过调用构造函数来进行初始化,如下边的代码,编译会报错(如果不写构造函数,即声明了 a,但是没有定义,也没有分配内存,同样会编译出错)。

class A {
public:
	A() { a = 1; }
	static int a; //声明但未定义,还未分配内存
};

int main() {
	printf("%d", A::a); // 无法解析的外部符号 "public: static int A::a"
	return 0;
}

  值得注意的是,在 A 中 static int a = 1; 也是不行的,但是 const static int a = 1; 是可以的。
  static类成员变量初始化方式是在类外进行初始化,而且一定要写类型,也就是对变量进行定义!如下所示:

class A {
public:
	static int a; // 仅完成了声明过程,并没有进行定义、赋初值以及分配内存。
};
int A::a = 1;

int main() {
	printf("%d", A::a); // 1
	return 0;
}

  static修饰的数据成员必须在类外进行初始化且只会初始化一次。

2.2 static 修饰成员函数

  static 修饰的成员方法为静态成员方法,静态成员方法可以在类内或类外定义,但必须在类内声明
  static 成员方法没有this指针,所以不能直接引用非 static 数据成员或调用类的非 static 成员方法,只能调用类的 static 成员数据和 static 成员方法(普通成员方法可以调用静态成员变量);
  static 成员函数不是任何对象的组成,不依赖对象的调用,所以 static 成员方法不能被声明为 const,因为 const 只限定该类的对象
  static 成员方法不能同时被声明为虚函数。

另:在类外调用static成员方法和数据成员时只需要加上类的作用域即可(如 A::a = 1;),他们都不依赖对象的调用(但可以加上对象限定,如 A aa; 然后 aa.a = 1; 或 aa.A::a = 1; )。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值