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


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

    下面我們首先說一說static。

    1、static的作用

     static變量的作用,主要可以歸納為以下幾點

      a、可以隱藏,如果在函數體外聲明成員變量,非static的成員變量,在A.cpp中聲明:int a;那么這樣其他源文件比如B.cpp是可以訪問到A.cpp中的a的。這樣極容易混淆,因為我們可能需要在B.cpp中聲明int a;而且也是對數據的一種保護,使A更安全。

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

     b、聲明為static的變量還具有持久性,這里說的持久性就是不依靠對象的改變而存在與否,因為static是屬於整個類的,他的聲明周期是源程序存在的聲明周期,不會以為某個對象new而產生然后delete而消失。這是static的一個非常重要的特性,甚至是最重要的特性。因為對於某些數據需要全體用戶共享的時候,static無疑是一種非常棒的解決方案。

     c、默認初始化。我們知道非static變量在全局變量中是會進行初始化的,但是在局部變量中,比如函數體內部是不會初始化的。但是static變量則不然,他會在所有情況下進行初始化。如static int a;a會初始化為0.

     類中static的作用。

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

     

   而應該在函數體外部定義

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

不足之處敬請指正!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM