C/C++辨析

開始複習C++,針對C與C++的一些關鍵不同和區別,做以下總結:

命名空間

c++誕生時,程序編寫已經越來越複雜了,爲了避免越來越長的函數和變量名稱,防止重名,於是C++中加入了命名空間機制。
說白了,就是把一堆變量和函數的聲明或者定義放在一起,然後起個集體的名字,就叫命名空間。

命名空間的用法

  • 當在命名空間外使用變量或者函數時,就需要指明是哪個命名空間,即需要加上作用域限定符說明。例如std::coutstd就是一個命名空間,::是限定符
  • 如果一個變量或者函數需要多次調用,每次使用都要加命名空間,會很煩,可以在程序開始加上一個using聲明來告知程序,後面的所有該變量/函數都來自某個命名空間。例如using std:cout;在後續的調用中程序會自動識別coutstd::cout
  • 如果需要用到一個命名空間裏的很多函數或者變量,一個個單獨using聲明又太麻煩,就可以直接聲明命名空間,using namespace std;將整個命名空間的所有定義一股腦全搬過來。

匿名命名空間
命名空間還可以不定義名字,不定義名字的命名空間稱爲匿名命名空間。由於沒有名字,該空間中的實體,其它文件無法引用,它只能在本文件的作用域內有效,它的作用域是從匿名命名空間聲明開始到本文件結束。在本文件使用無名命名空間成員時不必用命名空間限定。其實匿名命名空間和static是同樣的道理,都是隻在本文件內有效,無法被其它文件引用。
可以利用匿名命名空間,把一個文件中的全局變量對外隱藏起來,不被外部訪問,也避開了命名引起的變量重定義的問題。

引用和指針

在一篇舊文裏詳細寫過,參見C++ 常量指針、指針常量、引用和常引用的用法解析
主要注意以下兩點:

  • 引用是變量的別名。等同於直接調用引用指向的變量。而指針是變量的地址,需要解引用後才能訪問變量
  • 引用一經初始化便不能改變指向的對象,而指針只要不是指針常量,可以改變其指向

new/delete

C++中引入了新的申請內存的機制,new/delete機制。
C++中的new運算分爲兩步,第一,開闢空間,第二,調用構造函數初始化。
所以,C++中的new更加高級,甚至可以在現有地址上直接構造對象,而不分配內存。
一般用法爲new 類型[個數](初始化內容)
只進行初始化構造對象new(要構造對象的地址)類型[個數](初始化)

與malloc/free的區別

  • 申請的內存所處位置不同,new從自由存儲區上爲對象動態分配內存空間,而malloc函數從堆上動態分配內存。自由存儲區是C++的抽象數據區概念,專門用來指new申請的空間,既可以是堆,又可以是靜態存儲區
  • 性質不同,new/delete是一對運算符,而malloc/free是標準C庫函數
  • 效率不同,new/delete效率更高
  • 安全性不同,new/delete更安全
  • 返回值不同,new/delete返回的是帶類型的指針,malloc/free返回的是空類型的指針
  • new/delete可以對內存進行初始化,malloc/free不行
  • new/delete可以調用構造/析構函數,malloc/free不行
  • new可以不申請內存,malloc不行
  • malloc調用出錯返回NULL,new則會直接拋出異常

函數重載

函數重載也是C++中特有的機制,是指兩個不同的函數,函數名相同,但是函數形參不同,形參的不同可以是形參個數,也可以是形參類型。在發生函數調用時,編譯程序根據函數調用的形參類型個數自動進行匹配,
C++中函數重載機制的實現依賴於C++的獨特編譯機制,在編譯函數時會對函數名進行“改編”,從而區分出不同的重載函數。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章