C++中static、const使用方法簡介

    衆所周知,在c++中,static和const的使用方法是難點,也是重點,值得咱們隨時溫習,所謂溫故而知新是也。html

    下面咱們首先說一說static。c++

    一、static的做用安全

     static變量的做用,主要能夠概括爲如下幾點函數

      a、能夠隱藏,若是在函數體外聲明成員變量,非static的成員變量,在A.cpp中聲明:int a;那麼這樣其餘源文件好比B.cpp是能夠訪問到A.cpp中的a的。這樣極容易混淆,由於咱們可能須要在B.cpp中聲明int a;並且也是對數據的一種保護,使A更安全。this

       而若是在A.cpp中聲明的是:static int a;那麼只能在該文件中訪問了,在B.cpp中訪問不到a.這也間接的實現了封裝的效果。不少時候對於咱們數據的設計是很是有好處的。spa

     b、聲明爲static的變量還具有持久性,這裏說的持久性就是不依靠對象的改變而存在與否,由於static是屬於整個類的,他的聲明週期是源程序存在的聲明週期,不會覺得某個對象new而產生而後delete而消失。這是static的一個很是重要的特性,甚至是最重要的特性。由於對於某些數據須要全體用戶共享的時候,static無疑是一種很是棒的解決方案。設計

     c、默認初始化。咱們知道非static變量在全局變量中是會進行初始化的,可是在局部變量中,好比函數體內部是不會初始化的。可是static變量則否則,他會在全部狀況下進行初始化。如static int a;a會初始化爲0.指針

     類中static的做用。rest

     static 數據成員必須在內定義的外部進行定義,在類定義體中定義是錯誤的。code

     

   而應該在函數體外部定義

1 double Accout::interestRate=0.09; 2 double Accout::getNum(){ 3     return interestRate; 4 }

    類中靜態成員函數

    不能訪問非靜態函數或者變量。由於靜態成員函數是屬於類而不是某個對象,可是非靜態函數和變量是屬於某個對象的。因此靜態不能訪問非靜態。

    可是反過來,非靜態是能夠訪問靜態的。畢竟靜態是一直存在,屬於整個類。相信這個應該是很是容易理解的。

    static函數中不能使用this關鍵字,由於this通常指當前對象,而static不屬於任何對象。

    不能聲明爲virtual虛函數,虛函數的主要做用是實現多態,你們想象一下static。多態對static是沒有意義的,他壓根不屬於對象呀!

    static函數比普通函數訪問的速度快不少。這個能夠解釋爲普通函數須要首先訪問當前對象,而後再訪問當前對象的成員函數。這之間有多步轉化,他能快的過static函數麼?

     固然static關鍵字和普通成員或者函數都聽從private,public,protected訪問規則的。

     

   const用法

    const直觀的理解就是常量且不可修改。可是const的意義遠不止如此,下面讓咱們一一解剖:

    const int a=30;

    常量:a必須賦值,不賦值是不被容許的。試想若是不賦值,又由於const不可修改性,那麼a定義有意義嗎?這也是const變量必須賦予初始值得直接緣由。

    既然是常量,那麼是否是想到了常常用到的

    #define a 30;

    確實,上述語句也可以使a是常量。是否是const和define就是等價的呢?至少在這個用法上是等價的呢?

    固然不是,在程序運行是#define a 30;出現a只是簡單的用30來代替,出現屢次就代替屢次。重複這樣的過程會出現多個副本的產生,可是const就不會出現這種狀況,永遠保持一個副本;其次define也不能定義數據類型啊。

   這裏再講define須要注意的一個微小細節

#define fun(x) (x*x);

 

    程序中出現fun(5),會用(5*5)替換

    可是出現fun(5+6),只會用(5+6*5+6)代替。而不是(11*11).

 

   因此咱們儘可能少用define,多用const和inline內聯函數。

 

   const指針用法:

   咱們這裏說兩種指針,常量指針和指向常量的指針。以下:

    

    指向常量的指針能夠經過x改變,而後p中指向的值也改變了。

    可是相似*p=40;這樣修改是不被容許的。

  const參數和返回值

     表示返回的參數應該是const。const參數則表示該傳過去的參數是不可修改的。

    說到這裏當函數返回指針的時候,必定不能返回局部變量,由於函數在退出的時候,函數中的棧空間也清除了(局部變量會存儲在該空間中)。返回的已經不是咱們須要獲得的了,極可能返回亂碼。

   class中const使用。

   const 數據成員。成員只能在構造函數中初始化,不能在類聲明外初始化和static有比較大區別。

   類中的函數例如 void fun()const;表示不可改變當前對象。不可改變當前對象能夠理解爲,不能對當前對象中的成員進行左值操做!

  總結:static,const,const static初始化總結:

  static在class聲明外初始化。

   const在構造函數中初始化,若沒有構造函數就悲劇了。

  const static和static const同樣,在類外初始化。

 

1 class Accout{ 2 public: 3  Accout(); 4     static double interestRate; 5     const static double a; 6     const double c; 7     int b; 8 };

 

1 const double Accout::a=9; 2 double Accout::interestRate=0.09; 3 Accout::Accout():c(5){}

 轉載請註明出處:http://www.cnblogs.com/xiaoyi115/p/3622891.html

不足之處敬請指正!

相關文章
相關標籤/搜索