c++辨析系列談
本文主要是參考網上的一篇文章,對c++中的一些重要修飾符和函式(static,const,inline,虛函式)進行分析,一方面可以加深對c++的認識和理解;另一方面也是拋磚引玉,希望大家都參與討論,共同提高。
l static修飾符
static 是c++中很常用的修飾符,它被用來控制變數的儲存方式和可見性,下面我將從 static 修飾符的產生原因、作用談起,全面分析static 修飾符的實質。
static 的兩大作用:
一、控制儲存方式:
static被引入以告知編譯器,將變數儲存在程式的靜態儲存區而非棧上空間。
1、引出原因:函式內部定義的變數,在程式執行到它的定義處時,編譯器為它在棧上分配空間,大家知道,函式在棧上分配的空間在此函式執行結束時會釋放掉,這樣就產生了乙個問題: 如果想將函式中此變數的值儲存至下一次呼叫時,如何實現?
最容易想到的方法是定義乙個全域性的變數,但定義為乙個全域性變數有許多缺點,最明顯的缺點是破壞了此變數的訪問範圍(使得在此函式中定義的變數,不僅僅受此函式控制)。
2、 解決方案:因此c++ 中引入了static,用它來修飾變數,它能夠指示編譯器將此變數在程式的靜態儲存區分配空間儲存,這樣即實現了目的,又使得此變數的訪問範圍不變。
二、控制可見性與連線型別 :
static還有乙個作用,它會把變數的可見範圍限制在編譯單元中,使它成為乙個內部連線,這時,它的反義詞為」extern」.
static作用分析總結:static總是使得變數或物件的儲存形式變成靜態儲存,連線方式變成內部連線,對於區域性變數(已經是內部連線了),它僅改變其儲存方式;對於全域性變數(已經是靜態儲存了),它僅改變其連線型別。
[color=red] static區域性變數的」記憶性」與生存期的」全域性性」
所謂」記憶性」是指在兩次函式呼叫時, 在第二次呼叫進入時, 能保持第一次呼叫退出時的值.[/color]
初始化:
[color=red] int person::age=20;[/color]
[color=red].靜態成員函式不可以訪問非靜態成員(因為沒有this指標,指向某個物件,所以無法訪問非靜態成員)[/color]
靜態函式成員:
可以直接訪問該類的靜態資料和函式成員,而訪問非靜態成員必須通過物件名
靜態資料成員/成員函式(c++特有)
c+ +重用了這個關鍵字,並賦予它與前面不同的第三種含義:表示屬於乙個類而不是屬於此類的任何特定物件的變數和函式. 這是與普通成員函式的最大區別, 也是其應用所在, 比如在對某乙個類的物件進行計數時, 計數生成多少個類的例項, 就可以用到靜態資料成員. 在這裡面, static既不是限定作用域的, 也不是擴充套件生存期的作用, 而是指示變數/函式在此類中的唯一性. 這也是」屬於乙個類而不是屬於此類的任何特定物件的變數和函式」的含義. 因為它是對整個類來說是唯一的, 因此不可能屬於某乙個例項物件的. (針對靜態資料成員而言, 成員函式不管是否是static, 在記憶體中只有乙個副本, 普通成員函式呼叫時, 需要傳入this指標, static成員函式呼叫時, 沒有this指標. )
l const修飾符
const 是c++中常用的型別修飾符,但我在工作中發現,許多人使用它僅僅是想當然爾,這樣,有時也會用對,但在某些微妙的場合,可就沒那麼幸運了,究其實質原由,大多因為沒有搞清本源。故在本篇中我將對const進行辨析。溯其本源,究其實質,希望能對大家理解const有所幫助,根據思維的承接關係,分為如下幾個部分進行闡述。
c++中為什麼會引入const
c++的提出者當初是基於什麼樣的目的引入(或者說保留)const關鍵字呢?,這是乙個有趣又有益的話題,對理解const很有幫助。
1. 大家知道,c++有乙個型別嚴格的編譯系統,這使得c++程式的錯誤在編譯階段即可發現許多,從而使得出錯率大為減少,因此,也成為了c++與c相比,有著突出優點的乙個方面。
2. c中很常見的預處理指令 #define variablename variablevalue 可以很方便地進行值替代,這種值替代至少在三個方面優點突出:
一是避免了意義模糊的數字出現,使得程式語義流暢清晰,如下例:
#define user_num_max 107 這樣就避免了直接使用107帶來的困惑。
二是可以很方便地進行引數的調整與修改,如上例,當人數由107變為201時,進改動此處即可,
三是提高了程式的執行效率,由於使用了預編譯器進行值替代,並不需要為這些常量分配儲存空間,所以執行的效率較高。
鑑於以上的優點,這種預定義指令的使用在程式中隨處可見。
預處理語句雖然有以上的許多優點,但它有個比較致命的缺點,即,預處理語句僅僅只是簡單值替代,缺乏型別的檢測機制。這樣預處理語句就不能享受c++嚴格類
型檢查的好處,從而可能成為引發一系列錯誤的隱患。
4.好了,第一階段結論出來了:
結論: const 推出的初始目的,正是為了取代預編譯指令,消除它的缺點,同時繼承它的優點。
現在它的形式變成了:
const datatype variablename = variablevalue ;
為什麼const能很好地取代預定義語句?
const 到底有什麼大神通,使它可以振臂一揮取代預定義語句呢?
1. 首先,以const 修飾的常量值,具有不可變性,這是它能取代預定義語句的基礎。
2. 第二,很明顯,它也同樣可以避免意義模糊的數字出現,同樣可以很方便地進行引數的調整和修改。
3. 第三,c++的編譯器通常不為普通const常量分配儲存空間,而是將它們儲存在符號表中,這使得它成為乙個編譯期間的常量,沒有了儲存與讀記憶體的操作,使得它的
效率也很高,同時,這也是它取代預定義語句的重要基礎。這裡,我要提一下,為什麼說這一點是也是它能取代預定義語句的基礎,這是因為,編譯器不會去讀儲存的內容,如果編譯器為const分配了儲存空間,它就不能夠成為乙個編譯期間的常量了。
4. 最後,const定義也像乙個普通的變數定義一樣,它會由編譯器對它進行型別的檢測,消除了預定義語句的隱患。
const
若將成員成員函式宣告為const,則該函式不允許修改類的資料成員。例如,
[cpp] view plaincopy
class screen
int error(intival) const
};
C 中的訪問修飾符 修飾符 類
版本visual studio 2010 主要參考 修飾符用於修改型別和型別成員的宣告 訪問修飾符 訪問級別 public 訪問不受限制 類內和任何類外中訪問 protected 可訪問域限定於類內或從該類派生的類內 類內和該類的派生類 internal 可訪問域限定於類所在的程式集內 該類所在程式...
C 中的修飾符
c 中的修飾符有很多,可以分類 類修飾符,訪問修飾符,成員修飾符。public inner friend abastruct sealed public class classpublic 如果乙個類宣告為 public 則該類的應用不受限制。具體含義可與 inner 參考對比。inner clas...
C 中的修飾符
1.可空型別修飾符 引用型別可以使用空引用表示乙個不存在的值,而值型別通常不能表示為空。例如 string str null 是正確的,int i null 編譯器就會報錯。為了使值型別也可為空,就可以使用可空型別,即用可空型別修飾符 來表示,表現形式為 t?例如 int?表示可空的整形,datet...