static关键字

先从内存说起,最精简的嵌入式系统也要划分出以下这些section:

代码段

全局数据段

 

再说c++里面的static关键字,分五个部分:

1. 静态全局变量

2. 静态局部变量

3. 静态数据成员

4. 静态非成员函数

5. 静态成员函数

 

1. 静态全局变量

static关键字放在全局变量前面,这个全局变量就是静态全局变量了。

static int A; 后面A就是1类型的静态全局变量的代名词了

(1) A所占用的内存在全局数据段

(2) 要想使用A的文件就要先在文件内声明A,不声明则对于该文件A既不可见亦不可用

extern int A;  // 声明static int A

(3) 在声明了A的文件中,允许定义A同名变量,但是要注意编译器允许并不意味着不会出现运行时错误,建议还是不要做这样的定义。

 

2. 静态局部变量

static关键字放在局部变量前面,这个局部变量就是静态局部变量了。

static int B; 后面用B代名2类型的静态局部变量

(1) 加上了static关键字,B就从栈上搬家搬到了全局数据段,并在程序运行期内始终驻留全局数据段

(2) 加上了static关键字,B的作用域并不发生改变

举个例子:

#include <iostream>

void sum();

void main()

{

        int i;

        for(i=0; i<10; i++)

        {

                if (i % 2)

                    sum();

        }

        int B;

        B = i;

        cout << "B = " << B << endl;

}

void sum()

{

        static int B = 0;

        B++;

        cout << "static B = " << B << endl;

}

执行结果是:

static B = 1

static B = 2

static B = 3

static B = 4

static B = 5

B = 10

 

3. 静态数据成员

static关键字放在数据成员前面,这个数据成员就是静态数据成员了。

(1) 静态数据成员所占的内存在全局数据段

(2) 静态数据成员只有一份拷贝,无论类有多少个实例。我们知道声明不会分配空间,因此,不允许在类声明的时候初始化静态数据成员。但是也因为只有一份拷贝,因此适用于对象的共同属性变量,节省空间又方便修改。

(3) 初始化静态数据成员的方法

class A

{

public:

        static int s_a;

        ... ...

private:

        ... ...

};

int A::s_a = 100; 

(4) 静态数据成员是属于类的,即使没有实例,一样可以被访问,其也一样遵从public,protected,private规则

(5) public的静态数据成员a可以通过下面两个方法访问

A::s_a  或者 a.s_a  (a是A的一个实例)

 

4. 静态非成员函数

在非成员函数的前面加上static,非成员函数就变成了静态非成员函数。

(1) 在声明了静态非成员函数的文件内,可以使用静态非成员函数,而对于其他文件,静态非成员函数是不可见的

(2) 因为(1),所以不同文件可以有同名的静态非成员函数

 

5. 静态成员函数

成员函数前面加上static,成员函数就变成了静态成员函数。

(1) 静态成员函数只属于它所在的类,而不属于、不联系任何一个类的实例,因此既不能被this指针指向,也不能通过this指针访问类的其他非静态数据成员

(2) 静态成员函数能调用的只有类的其他静态成员函数,以及类的静态数据成员

(3) 但是类的其他非静态成员函数可以访问静态成员函数,public的静态成员函数还可以被类外的代码访问调用

(4) 调用方法

类名::静态函数名(参数)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值