衆所周知,在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
不足之處敬請指正!