[C++]static详细说明

转自:http://www.cnblogs.com/SelaSelah/archive/2012/04/09/2438651.html

static用于声明全局变量(包括类的对象),局部变量全局函数,类的成员变量成员函数。即,static不能用于类、结构、枚举、联合的声明。

static有如下用途:

①使变量具有初值

静态变量具有初值。局部变量是没有初值,而static的局部变量将有初值。全局变量本身就具有初始值,所以static不发生作用。static用于全局变量,更多是用于解决命名冲突问题。

static确定初始值

 

②声明全局变量

如果一个变量在所有的块之外,那么这个变量是全局变量,具有static duration(即也有初始值)和external linkage特性。注意要使用extern关键字。如果两个编译单元都使用同名的全局变量,将报错。(Visual Studio中。Linux下参考强符号、弱符号)

// external linkage
int a;
复制代码
#include <iostream>
extern int a;
int main()
{
    std::cout << a << std::endl;
    system("pause");
}
复制代码

但是,用static修饰后,此变量将变为external linkage。无法被外部Link。

// external linkage
static int a = 5;
复制代码
#include <iostream>
static int a;
// 将报错error LNK2001: 无法解析的外部符号 "int a" (?a@@3HA)
//extern int a;
int main()
{
    std::cout << a << std::endl;
    system("pause");
}
复制代码

然而,static不支持类、结构、枚举的修饰,比起static修饰,更推荐使用namespace解决命名冲突(参见匿名namespace)。

③声明全局函数

全局函数类似,如果要改变其external linkage的特性,需要使用static。

④声明局部变量

用static声明局部变量虽然不改变其可见性,但变量仍然是static duration的,在其可见域外,仍可以使用地址访问之。

复制代码
#include <iostream>
int* p;
void foo()
{
    static int a;
    if (a == 0)
    {
        a = 10;
        p = &a;
    }
    a++;
}
void main()
{
    foo();
    // 将报错,a不可见
    //std::cout << a << std::endl;
    std::cout << *p << std::endl; // 11
    *p = 20;
    foo();
    std::cout << *p << std::endl; // 21
    system("pause");
}
复制代码

 

⑤声明类的成员变量

除了显然意见的作用外,有两个注意点:

1. static的成员变量必须在file scope定义(即便不改变初值也要声明)

复制代码
#include <iostream>
class A
{
public:
    static int a;
};
// 如果不定义,会报错
/* error LNK2001: 无法解析的外部符号 "public: static int A::a" (?a@A@@2HA) */

// 如果在定义时增加了static关键字,会报错
/* error C2720: “A::a”: 成员上的“static ”存储类说明符非法 */
//static int A::a;

// 定义的时候可以指定初值
int A::a = 5;

void main()
{
    std::cout << A::a << std::endl;
    system("pause");
}
复制代码

2. 对于const static类型,除了以上方法外,还可以直接在类中初始化~不是const不成哦~

复制代码
#include <iostream>
class A
{
public:
    static const int a = 5;
};
// 如果类中初始化了,这里就不能再次初始化了
//const int A::a = 5;

void main()
{
    std::cout << A::a << std::endl;
    system("pause");
}
复制代码


⑥声明类的成员函数

显而易见的作用

 

附录:

union的成员是特殊的。不能将其成员定义为static。原因?看看union是干什么的吧~

这些英文术语极其难翻译,干脆直接贴上来。后边有解释。

static duration:静态生存期,程序创建时即分配此变量的内存,存放在全局静态存储区。程序创建时分配,结束时销毁。具有初始值。

C++内存分配:静态存储区常量存储区自由存储区

全局静态存储区:程序创建时分配,结束时销毁。

常量存储区:不允许修改。程序创建时分配,结束时销毁。

:局部变量、函数参数等。生存期结束后销毁。空间较小,不过可以手动修改。

:动态内存分配(new)。编译器不负责回收。

自由存储区:动态内存分配(malloc)。编译器不负责回收。

external linkage:可以外部链接的。即其他编译单元(.cpp文件)可以使用此变量。也就是说,如果在两个编译单元中使用了同名的static变量,会出错~

internal linkage:不能外部链接。


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值