现在的位置: 首页 > 综合 > 正文

staitc 变量以及成员

2014年01月16日 ⁄ 综合 ⁄ 共 1271字 ⁄ 字号 评论关闭
  1. class SavingAccount
  2. {
  3.   private:
  4.   char m_name[40]; // 存户姓名
  5.   char m_addr[60]; // 存户地址
  6.   double m_total; // 存款额
  7.   static double m_rate; // 利率
  8. };

m_rate是一个静态成员,他和nonstatic有什么不同呢。

static 成员变量不属于对象的一部份,而是类别的一部份,所以程序可以在还没有诞生任
何对象的时候就处理此种成员变量。但首先你必须初始化它。

不要把static 成员变量的初始化动作安排在类别的构造式中,因为构造式可能一再被调
用,而变量的初值却只应该设定一次。也不要把初始化动作安排在头文件中,因为它可
能会被包含许多地方,因此也就可能被执行许多次。你应该在实作档中且类别以外的任
何位置设定其初值。例如在main 之中,或全域函数中,或任何函数之外:

  1. double SavingAccount::m_rate = 0.0075; // 设立static 成员变量的初值
  2. void main() { ... }

这么做可曾考虑到m_rate 是个private 资料?没关系,设定static 成员变量初值时,
不受任何存取权限的束缚。请请注意,static 成员变量的型别也出现在初值设定句中,因为
这是一个初值设定动作,不是一个数量指定(assignment)动作。事实上,static 成员变
量是在这时候(而不是在类别声明中)才定义出来的。如果你没有做这个初始化动作,会产生联结错误。

下面是存取static 成员变量的一种方式,注意,此刻还没有诞生任何对象实体:

  1. // 第一种存取方式
  2. void main()
  3. {
  4.    SavingAccount::m_rate = 0.0075; // 欲此行成立,须把m_rate 改为public
  5. }

下面这种情况则是产生一个对象后,透过对象来处理static 成员变量:

  1. // 第二种存取方式
  2. void main()
  3. {
  4. SavingAccount myAccount;
  5. myAccount.m_rate = 0.0075; // 欲此行成立,须把m_rate 改为public
  6. }

需要搞清楚一个观念,static 成员变量并不是因为对象的实现而才得以实现,它本来就存
在,你可以想象它是一个全域变量。因此,第一种处理方式在意义上比较不会给人错误
的印象。

        只要access level 允许,任何函数(包括全域函数或成员函数,static 或non-static)都可
以存取static 成员变量。但如果你希望在产生任何object 之前就存取其class 的private
static 成员变量,则必须设计一个static 成员函数。

       由于static 成员函数不需要借助任何对象,就可以被调用执行,所以编译器不会为它暗
加一个this 指针。也因为如此,static 成员函数无法处理类别之中的non-static 成员变
量。成员函数之所以能够以单一一份函数码处理各个对象的成员而不紊乱,完全靠的是this 指针的指示。

抱歉!评论已关闭.