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