c++ 指標和引用的區別:
相同點:
1、都是對位址的概念;指標指向一塊記憶體,而引用是某塊記憶體的別名。
不同點:
1、指標本身就是乙個物件,允許對指標賦值和拷貝。引用僅是個別名
2、指標不需要在定義的時候賦初值,即可以為空,而且指標生命週期內可以先後指向幾個不同的物件。但是引用必須要初始化 ,不但不能為空而且還只能一直和初始值物件繫結到一起。引用從一而終。
3、對指標使用時需要解引用(*
)還要判斷下指標是否為空,而引用使用時無需解引用也不需判斷。
4、sizeof 指標,得到的是指標本身(所指向的變數或物件的位址)的大小(
4個位元組)。
sizeof
引用 得到的是指向的變數(物件
)的大小。 5、
指標和引用的自增運算的意義不一樣。對指標++
,會使指標值向下乙個物件,而不是改變所指物件的值。但對引用
++,直接操作到的所指的物件。
6、( const )常量指標和常量引用。常量指標表示指向的物件是常量,不能改變其所指物件的值,藥箱存放常量物件的位址,只能引用指向常量的指標。 允許乙個指向常量的指標指向乙個非常亮物件。和常量引用一樣,指向常量的指標僅僅要求:不能通過改制真改變物件的值,而沒有規定那個物件的值不能通過其他途徑改變。
常量引用: 在初始化常量引用是允許用任意表示式作為初始值,只要該表示式的結果能轉換成引用的型別即可。 尤其,允許為乙個常量引用繫結非常量的物件,字面值甚至是乙個表示式。
對常量的引用不能被用作修改它所繫結的物件。
const物件一旦建立後其值就不能在改變,所以
const
物件必須初始化。
const
物件僅在檔案內有效。當有必要在檔案間共享時,解決辦法是只在乙個檔案中定義
const
,而在其他檔案中宣告並使用它;對
const
變數不管是宣告還是定義都新增
extern
關鍵字,對常量的引用不能被用作修改它所繫結的物件。
有乙個規則可以很好的區分const
是修飾指標,還是修飾指標指向的資料
——畫一條垂直穿過指標宣告的星號(
*),如果
const
const
出現在右邊,指標本身為常量。而引用本身與天俱來就是常量,即不可以改變指向。
c++記憶體分配方式
記憶體分配方式有三種:堆疊,靜態儲存區域分配
1、stack堆(先進先出)分配,也稱為動態記憶體分配。程式在執行用
malloc
或new
申請任意多的記憶體,程式設計師自己負責在不用時用
free
或delete
釋放記憶體。一般乙個
new要對應乙個
delete
,若程式設計師沒有釋放掉,則程式結束後作業系統自動**。堆可以動態的擴充套件和伸縮。非常靈活,但容易出錯也多。它與資料結構中的堆是兩回事,分配方式類似於鍊錶。
2、heap棧(先進後出)分配,由編譯器在需要的時候自動分配,再不需要時自動清除的變數儲存區。裡面的變數通常是區域性變數、函式引數等。操作方式類似於資料結構中的棧。
3、static全域性區(靜態區)
全域性變數和靜態變數
的儲存是放在一塊
的,初始化
的全域性變數和靜態變數在一塊區域, 未初始化
的全域性變數和未初始化
的靜態變數在相鄰
的另一塊區域。 -
程式結束後由系統釋放。
-->
分別是data
區,bbs區。
a、堆疊的區別:管理方式、空間大徐璈(一般32位系統堆可達
4g空間,棧一般有一定的空間大小)
、能否產生碎片、生長方向(堆向上,即記憶體位址增加的方向;棧向下,即記憶體位址減小的方向)、分配方式、分配效率(棧是機器系統提供的資料結構,堆是c/c++
函式庫提供的,所以棧的效率要高
)。
b、const分
頂層const
:指標本身是個常量,可表示任意的物件是常量;
‚底層const
:指標所指物件是乙個常量,與指標和引用等復合型別的基本型別部分有關。特殊,指標型別即可是頂層
const
也可是底層
const。
malloc和
new的區別
malloc與
free
是c++/c
語言的標準庫函式,
new/delete
是c++
的運算子。它們都可用於申請動態記憶體和釋放記憶體。
1、new 是
c++中的
操作符,malloc是c
中的乙個函式 2、
new
不止是分配記憶體,而且會
呼叫類的建構函式
,同理delete
會呼叫類的析構函式,而
malloc
則只分配記憶體,不會進行初始化類成員的工作,同樣
free
也不會呼叫析構函式
3、記憶體洩漏
對於malloc
或者new
都可以檢查出來的,區別在於
new可以指明是那個檔案的那一行,而
malloc
沒有這些資訊。
4、new
可以認為是
malloc
加建構函式的執行。
new出來的指標是直接
帶型別資訊
的,而malloc
返回的都是
void指標。
5、new和
malloc
雖然都是申請記憶體,但
申請的位置不同
,new
的記憶體從
free store
分配,而
malloc
的記憶體從
heap
分配(詳情請看
iso14882
的記憶體管理部分),
free store
和heap
很相似,都是動態記憶體,但是位置不同,這就是為什麼
new出來的記憶體不能通過
free
來釋放的原因。不過微軟編譯器並沒有很好的執行標準,很有可能把
free store
和heap
混淆了,因此,
free
有時也可以。
6、delete
時候不需要
檢查null
,而free(null)
那就麻煩大了。
new/delete的功能完全覆蓋了
malloc/free
,c++
不把malloc/free
淘汰出局,是因為
c++程式經常要呼叫
c函式,而
c程式只能用
malloc/free
管理動態記憶體。
c++中
static
關鍵字總結
static分為面向過程設計中的
static
和物件導向程式設計中的
static
,前者主要
作用於普通變數和函式;後者主要說明static
在類中的使用。
1.1靜態全域性變數
在全域性變數前加上static
就成了靜態全域性變數。全域性變數本身就是靜態儲存,靜態全域性變數當然也是靜態儲存方式。
非靜態全域性變數的作用域是整個源程式,而靜態全域性變數的作用域侷限於乙個原始檔內。靜態變數包括靜態區域性變數
都在全域性資料區分配記憶體。乙個完整的程式,在記憶體中分為
**區、全域性資料區、堆區、棧區。
1.2 靜態區域性變數
通常函式體內定義乙個變數,每當程式執行到該語句時分配記憶體,退出函式體後自動**記憶體,區域性變數也相應失效。但有時需要兩次呼叫之間對該變數的值進行儲存。因為用全域性變數,則變數已不屬於函式本身給程式維護帶來不便,所以靜態區域性變數就是用來處理這種情況的。靜態區域性變數在全域性資料區分配記憶體;在程式執行到該物件的宣告處被首次初始化(若沒有顯示初始化,程式自動初始化為0),以後的函式呼叫就不再初始化;他始終駐留在全域性資料區,知道程式結束,但其作用域為區域性作用域,當定義它的函式或語句塊結束時,作用域也跟著結束。
從以上分析可以看出,把
區域性變數改編為靜態變數是改變了它的儲存方式即改變了它的
生存期。把
全域性變數改為靜態變數後是改變了它的作用域,限制了它的
使用範圍。
1.3 靜態函式
在函式返回型別前加上static關鍵字,就定義為了靜態函式。靜態函式只能在宣告他的檔案中可見,不能被其他檔案使用。
2.1 靜態資料成員
在類內資料成員的宣告前加上關鍵字static。靜態資料成員實際上是類域中的全域性變數。所以靜態資料成員的定義(初始化)不應該放在標頭檔案中。其定義方式與全域性變數相同。初始化形式:
《資料型別》《類名》::《靜態資料成員名》=《值》
類的靜態資料成員兩種訪問方式:
《類物件名》.《靜態資料成員名》
或《類型別名》::《靜態資料成員名》 a
、靜態資料成員被類的所有物件所共享,包括該類派生類的物件。
b、c++靜態資料成員可以成為成員函式的可選引數
c、c++靜態資料成員的型別可以是所屬類的型別,而普通成員函式只能宣告為所屬類型別的指標或引用。
2.2靜態成員函式
靜態成員函式為類的全部服務而不是為某乙個物件,和靜態資料成員一樣都是類的內部實現,屬於類定義的一部分。普通的成員函式一般都隱含了乙個this指標(this指標指向物件本身),靜態成員函式不與任何的物件相聯絡,所以它沒有this指標。因此,它只能呼叫其他靜態成員函式而且相比類的全域性函式它在速度上會有少許的增長。非靜態的成員函式可以任意的訪問靜態成員函式和靜態資料成員。
呼叫靜態成員函式,可以用成員訪問操作符(.)和(->)為乙個類的物件或者指向類物件的指標呼叫靜態成員函式。也可以用以下格式:
《類名》::《靜態成員函式名》(《參數列》)
C 面試知識點
大概是一些面試可能會碰到的c 知識點。具體見effective c 3e 宣告使得名字為程式所知,而定義負責建立與名字關聯的實體 只在堆上 將建構函式和析構函式設定為保護,再定義兩個函式專門用於建立和銷毀物件。只在棧上 禁用class的new運算子,就是將class的operator new宣告為私...
《C 面試知識點》
動態記憶體 1.由內建指標管理的動態記憶體 即new和delete管理動態記憶體 直到被顯式釋放之前它都是存在的。假設該指標變數被銷毀,那該記憶體將不會自動釋放 即所謂的 記憶體洩漏 2.可以用new返回的指標來初始化智慧型指標,但必須使用直接初始化的形式,而不能隱式轉換,因為接受指標引數的智慧型指...
java面試知識點(1)
一直對tcp http 和socket稀里糊塗的,今天專門的查了下 tcp ip是個協議組,它分為網路層,傳輸層和應用層,網路層 ip協議 icmp協議 arp協議 rarp協議和bootp協議。傳輸層 中有tcp協議與udp協議。應用層 ftp http telnet smtp dns等協議。tc...