static笔记

c与c++ 中都有static 关键字,主要用于修饰局部变量、全局变量、函数;c++ 中还有类数据成员与成员函数。static 的主要作用包括:
1. 扩展生命周期
2. 限制作用域
3. 唯一性

static修饰局部变量

/*
来自:http://blog.csdn.net/shanghairuoxiao/article/details/72904292
static 修饰局部变量
static修饰局部变量时,使得被修饰的变量变成静态变量,存储在静态区。存储在静态区的数据
生命周期与程序的生命周期相同,即在main函数之前初始化,在程序退出时销毁。(无论是局部
静态还是全局静态)
局部静态变量使得该变量在退出函数后不会被销毁,因此在此调用该函数时,该变量的值与上次
退出函数时值相同。声明周期并不代表其可以一直被访问,因为变量的访问还受作用域的限制。


*/
#include <iostream>
using namespace std;

void fun()
{
    /* 实际上sCnt的初始化不是在函数体第一次执行时完成的,而是在编译期其值
        就已经确定,在main函数之前就已经完成初始化,所以静态变量只会初始化一次
    */
    static int sCnt=0;
    cout<<"call fun :"<<++sCnt<<" times"<<endl;
}
static int sIint = 3;
int main(int argc, char const *argv[])
{
    cout<<"sIint: "<<sIint<<endl;//在main函数之前就已经初始化且只初始化一次
    for (int i = 0; i < 10; ++i)
    {
        fun();
    }
    // cout<<sCnt<<endl; //error: 'sCnt' was not declared in this scope  注意变量的作用域
    return 0;
}
/*
输出:
sIint: 3
call fun :1 times
call fun :2 times
call fun :3 times
call fun :4 times
call fun :5 times
call fun :6 times
call fun :7 times
call fun :8 times
call fun :9 times
call fun :10 times
*/

static修饰全局变量

//头文件a.h
#ifndef _A_H
#define _A_H 
static int a = 1;
void fun1();
#endif
//实现文件a.cpp,包含头文件a.h

#include "a.h"

#include <iostream>
using namespace std;
void fun1()
{
    cout<<__FILE__<<" "<<__LINE__<<" "<<__FUNCTION__<<" a:"<<a<<"  &a:"<<&a<<endl;
}

#ifndef _B_H
#define _B_H
#include "a.h"
void fun2();
#endif
//实现文件b.cpp,包含头文件a.h

#include "b.h"
#include "a.h"
#include <iostream>
using namespace std;
void fun2()
{
     a++;
    cout<<__FILE__<<" "<<__LINE__<<" "<<__FUNCTION__<<" a:"<<a<<"  &a:"<<&a<<endl;
}
/*
    全局变量本来就存储在静态区,因此static并没有改变其存储位置。但是static
    限制了其链接属性。被static修饰的全局变量只能被包含该定义的文件访问。
*/
#include "a.h"
#include "b.h"
#include <iostream>

using namespace std;
int main()
{
    fun1();
    fun2();
    fun1();

    return 0;
}
/*
输出:
a.cpp 9 fun1 a:1  &a:0x601278
b.cpp 10 fun2 a:2  &a:0x60127c
a.cpp 9 fun1 a:1  &a:0x601278
从输出的结果可以发现,在文件b中修改了全局变量a,并没有使文件a中的变量a发生变化,
从对不同文件中变量a的存储地址来看,静态全局变量a在文件a.cpp与b.cpp中分别进行了
定义。使得全局变量可以同名。
*/

static 修饰函数

static修饰函数使得函数只能在包含该函数定义的文件中被调用。

在头文件b.h中声明静态函数fun(),在文件b.cpp中定义静态函数fun(),编译器会报错,指明b.h中的fun函数未定义。
对于静态函数,声明和定义需要放在同一个文件夹中。

如果将static函数定义在头文件中,则每一个包含该头文件的文件都实现了一个fun函数。因此static实现了不同文件中定义同名的函数,而不发生冲突。

在多人协同工作的项目中,为了避免出现同名的函数冲突,可以将函数定义为static,从而避免冲突的发生。

static修饰c++中的类

在C++中static不光具备C中所有的作用,而且对于静态成员变量和静态成员函数。所有的对象都只维持同一个实例。
因此,采用static可以实现不同对象之间数据共享。

class Point
{
public:
  ....
  static void show()
  { cout << count <<endl;}
private:
  ...
  static int count;    //这里只声明,没有分配内存,没有初始化。           
}

int Point::count = 0; // 这里初始化静态变量


int main()
{
   Point a(4,5);
   Point::show();  //也可以a.show();
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值