C++关键字static的使用

									C++关键字static的使用

1.修饰局部变量,改变其数据存放区域,其生命周期扩大,但作用域还是在函数内,下面用代码说明:

#include <iostream>
using namespace std;
void test01()
{
    static int i; //使用static修饰后,数据放入全局数据区,默认初始化为0;
    cout << i++ << " === "<<  __FUNCTION__ << endl;
}
void test02()
{
    int i; //局部变量,使用后即释放,若不进行初始化,其值不确定
    cout << i++ << " === "<<  __FUNCTION__ << endl;
}
int main() {
    test01();
    test02();
    return 0;
}

输出结果为:

D:\c_c++\Cplusplus_Sample\cmake-build-debug\Cplusplus_Sample.exe
0 === test01
4201099 === test02

稍微改变程序:

#include <iostream>
using namespace std;
void test01()
{
    static int i = 0; //使用static修饰后,数据放入全局数据区,默认初始化为0;
    cout << i++ << " === "<<  __FUNCTION__ << endl;
}
void test02()
{
    int i = 0; //局部变量,使用后即释放,若不进行初始化,其值不确定
    cout << i++ << " === "<<  __FUNCTION__ << endl;
}
int main() {
    test01();
    test02();
    test01();
    test02();
    return 0;
}

输出结果为:

0 === test01
0 === test02
1 === test01
0 === test02

可看出使用static修饰的局部变量值的生命周期确实是扩大了。静态局部变量使用static修饰符定义,即使在声明时未赋初值,编译器也会把它初始化为0。且静态局部变量存储于进程的全局数据区,即使函数返回,它的值也会保持不变。

2.修饰全局变量:静态全局变量仅对当前文件可见,其他文件不可访问,其他文件可以定义与其同名的变量,两者互不影响。也就是说,使用static修饰的全局变量只能在本文件使用,限定了其作用域.这样有利于降低模块之间的耦合。

3.修饰函数:与全局变量雷系,使用static定义的函数为静态函数,只能在本文件中使用,外部文件无法访问,其他文件可定义相同名字的函数,两者互不影响。

4.修饰成员变量:成员变量使用static修饰之后成为静态成员变量,其含义是这个对象是类所有,而不是类实例化的对象所有。可使用<类名:成员变量名>进行访问。

  • 静态数据成员存储在全局数据区,静态数据成员在定义时分配存储空间,所以不能在类声明中定义。需要在类外进行初始化。
  • 静态数据成员是类的成员,无论定义了多少个类的对象,静态数据成员的拷贝只有一个,且对该类的所有对象可见。也就是说任一对象都可以对静态数据成员进行操作。而对于非静态数据成员,每个对象都有自己的一份拷贝。
  • 和普通数据成员一样,静态数据成员也遵从public, protected, private访问规则
  • 静态数据成员的初始化格式:<数据类型><类名>::<静态数据成员名>=<值>

5.修饰成员函数:与修饰成员变量类似,使用static修饰的成员函数不属于类的实例化对象,只属于类。可使用<类名::函数名()>访问。

  1. 静态成员函数没有this指针,它无法访问属于类对象的非静态数据成员,也无法访问非静态成员函数,它只能调用其余的静态成员函数

  2. 出现在类体外的函数定义不能指定关键字static,说明:

class Person
{
public:
    static void printf();
};
//错误写法
static void Person::printf() {

}
正确写法
void Person::printf()
{
}
  • 非静态成员函数可以任意地访问静态成员函数和静态数据成员

最后说明一下,在实际的项目中,static用处非常多,可用其来定义一些接口,在类外使用<类名::函数名>访问.这样保证函数运行过程中只有一份数据存在。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值