静态类成员

静态类成员,Static Class Members.
00. 静态类成员更多的是与类(class)本体直接相关,而不是与类生成的独立的对象(object)相关,即static成员不依赖任何类对象存在.
01. 可共享于不同的对象.
02. 类生成的对象并不包含静态(static)成员.即每个对象只是包含(contain)【calculate函数,own字符串,amount浮点数】.
03. There is one ''interestRate'' object that will shared by all the '''Account''' object.
04. 静态成员函数,不能被声明为(const),也没有(this)指针,也不绑定任何类生成的对象(object).
05. 创建类对象的时候,静态(static)成员并不会被构造函数(consturctor)初始化.//一般来说,也不会在类体内初始化static成员
    但是,我们 必需 在类体外完成对静态(static)成员的初始化.               //静态成员只能被定义(defined)一次.
06. 有一个确保静态(static)成员只被定义一次的好方法就是
    把它的定义(define)和 非内联(inline)类成员的定义(define) 放在同一个文件中.
07. Tip:static 成员的血量就像 globle 对象一样长,一直存在到程序结束.


08. 我们一般不在类主体(body)内初始化静态成员,但是我们有时候会提供一种 类内初始化器(in-class initializer)
    来帮助我们完成某些事情,比如数组的维数确定                           //维数需要 constexpr of literal type
  //static constexpr int period = 30;   这个时候,''period'' 就是constant expression.
  //                                    Tips:当然,这里使用 const 也是可以编译通过的.毕竟C++中本来就建议使用 const 来替代 #define.
  //double arr[period];                 ok,这是可行的.
09. 即使一个(const static)成员在类主体内被初始化了,我们依旧应该在 类外 定义(define)它
    constexpr int period;             //此时在类体外(outside class),但不给他初始化的值(initializer).


10. 我们可以让一个静态成员用在构造函数(constructor)的形参中,让它充当默认值(default argument),但非静态成员就不行. 
/*******************************************************************************/
class Account{
public:
  Account(double catch = interestRate);              //构造函数
  void calculate(){amount += amount * interestRate;} //成员函数
  static double rate(){return interestRate;}         //inline静态成员函数
  static void rate(double);                          //静态成员函数
private:
  std::string owner;                                 //类数据成员
  double amount;                                     //
  static double interestRate;                        //静态成员
  static double initRate();                          //静态成员函数
};


//我们可以在类主体(body)内直接完成定义静态成员函数 
//也可以在类体外定义 
//这时候我们就 不需要 再写一遍关键字 (static)
//它只需要出现在类体中的声明即可。
void Account::rate(double newRate)
{
  interestRate = newRate;
}


//我们可以使用initRate()给interestRate初始化,尽管它是private
double Account::interestRate = initRate();
/*******************************************************************************/


使用类静态成员,Using Class Static Menbers.
1. double r = Account::rate();//使用scope operate能够访问类静态成员.


2. Account a;
   Account *pa = &a;
   r = a.rate();
   r = pa->rate();
  // 尽管类静态成员并没有被类对象包含在内,但任然可以像正常的成员一样被类对象访问到。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值