搞清楚 static key word的meaning

在 iso c99标准中:

当static 用于函数定义时,或用于代码块之外的变量声明时,static  用于修改标识符的连接属性,从external 改为 internal,但标识符的存贮类型和作用域不受影响。用这种方式声明的函数或变量只能在声明他们的源文件中访问。

 

当它作用于代码块内部的变量声明的时候, static用于修改变量的存贮类型,从自动变量修改为静态变量,但变量的链接属性和作用域不受影响。用这种方式声明的变量在程序执行之前创建,并在程序的整个执行期间一直存在,而不是每次在代码快开始执行时创建,在代码执行完毕后销毁。

 

然在c++中,staic 关键字被赋予了更多的修饰意义。 待续.........

 

2010-10-31

static 数据成员独立于该类的任意对象而存在;每个 static 数据成员是与类关联的对象,并不与该类的对象相关联。(c++对象模型关于对象模型的讨论中,static  和 non-static function和static data members都放在class object的外部,只有nonstatic data member被放置于class object 之内)

 

static 成员函数没有 this 形参,它可以直接访问所属类的 static 成员,但不能直接使用非 static 成员。(static 成员是类的组成部分但不是任何对象的组成部分)

 

static 成员可以是私有成员

 

因为 static 成员不是任何对象的组成部分,所以 static 成员函数不能被声明为 const

static 成员函数也不能被声明为虚函数

static 数据成员必须在类定义体的外部定义(正好一次)。不像普通数据成员,static 成员不是通过类构造函数进行初始化,而是应该在定义时进行初始化。

static 数据成员一般在class boby 外定义时才初始化(在class 内部是声明),而整型const static data members 是个例外,可以在class boby 中定义初始化。

class Account {
     public:
         static double rate() { return interestRate; }
         static void rate(double);  // sets a new rate
     private:
         static const int period = 30; // interest posted every 30 days
         double daily_tbl[period]; // ok: period is constant expression
     };

     // definition of static member with no initializer;
     // the initial value is specified inside the class definition
     const int Account::period;

 2011-3-25

#include <iostream>
using namespace std;

int foo(int i)
{
     static int value = i++;//定义
    cout << ++value << endl;
 return 0;
}

int main()
{
    foo(0);
    foo(1);
    foo(2);
}

 

输出结果应该是 0

                       0

                      0

 

居然被被误认为0 1 2,我明明知道local static members的生命周期,但是忽略了定义与“求值”的区别。

 static local object 确保不迟于在程序执行流程第一次经过该对象的定义语句时进行初始化。

而从机器上实验,不能在执行过程中定义初始化多次,仅仅一次。

 

与下面的程序区分开来:

size_t count_calls()

{

         static size_t ctr = 0;

         return ++ctr;

 

}

 

int main()

{

       for(size_t i = 0; i != 10; ++i)

             cout << count_calls() << enl;

       return 0;

}

 

out:1 2 3 4.....

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值