C++:01.從C到C++:引用,inline,函數重載,全局和局部變量,this,new與malloc

頭文件:C++的標準輸入輸出頭文件#include <iostream>。一般還配有using namespace std;表示使用std名命空間。


在C++中,聲明一個函數時,可以爲函數的參數指定默認值。當調用該函數時,如果沒有參數,將使用默認值作爲參數。


面嚮對象語言:

四大特徵:封裝(在語言上是通過訪問限定符體現的:public private)        繼承       多態       抽象         三大:去掉抽象。

如何用oop思想來設計代碼(軟件):實體(屬性和行爲)  ->  ADT(abstract  data  type)  ->  類  ->  對象

類並不佔空間,對象佔空間。類相當於圖紙,對象相當於房子

oop語言:程序=對象+對象+對象。。。+消息交互

類與類之間常用關係:組合   繼承。


引用:

類型名 &引用名 = 同類型的某變量名; 
eg:
int a = 10;
int & b = a;

引用相當起別名。

注意:

1、引用實際是通過指針實現的。引用實際上就是一個常量指針。目標是爲了提供比指針更高的安全性,因爲常量指針一旦與變量地址綁定將不能更改,這樣降低了指針的危險係數,它提供了一種一對一的指針。參數傳引用的方法類似與指針。

2、引用在內存中佔4個字節。因爲在表達式中,使用引用就像使用變量本身,所以使用sizeof運算符是得不到引用本身的大小。要想得到引用的大小,我們可以定義一個類,該類的私有成員是一個引用,在使用sizeof來計算該類的大小。

3、引用不佔空間的意思是不佔用對象空間,不表示不佔指針的少量空間。引用類型的變量會佔用內存空間,佔用的內存空間的大小和指針類型的大小是相同的。 從上面的彙編代碼可以看出,雖然引用是一個對象的別名,但是在彙編層面,和指針是一樣的。

4,定義引用一定要初始化。引用只能引用變量。

5、常引用和常指針類似,都是不能通過常引用取修改其引用的內容。

補充:常量成員變量和引用成員變量必須在構造函數的初始化列表中進行初始化。常量型成員變量的值一旦初始化,就不能再改變。


內聯函數:inline

內聯函數,直接在代碼裏展開,不用函數調用開銷。

一般的函數使用雖然能夠避免代碼重寫多次,還能減少可執行程序的體積,但也會造成運行時間上的開銷。雖然說這個開銷可以忽略不計,但如果函數內部語句很少,本身執行時間還不如調用函數所需的時間長,我們就可以將這個函數寫爲內聯函數。

在函數前加上inline關鍵字即可。內聯函數和普通函數的區別在於:當編譯器處理調用內聯函數的語句時,不會將該語句編譯成函數調用的指令,而是直接將整個函數體的代碼插人調用語句處,就像整個函數體在調用處被重寫了一遍一樣。很顯然這樣增加了體積,但速度提高了,就是用空間換時間

注意:調用內聯函數前必須有內聯函數的定義,不能只出現聲明。


函數重載:

只要參數表不同即可。返回值不同,參數表相同不叫重載,叫重定義。注意:編譯導致二義性會報錯。

在c語言中是不支持函數重載的,原因:在於符號!c語言函數生成符號跟函數名有關,所以導致同名函數符號一樣。c++符號不僅與函數名有關還和參數有關,所以不會導致同名函數符號相同,所以可以重載。


全局變量和局部變量:

全局變量:在程序載入內存時就已經分配好了存儲空間,運行期間地址不變。初始化爲0。

局部變量:初始化爲隨機值。其定義在函數內,存儲空間是動態分配在棧中的,因爲函數每次被調用時局部變量被保存的地址不一樣,其自動初始化的工作不是一次性的,這會帶來無謂的開銷。


this指針:

在C++語言中,同一個類可以定義很多對象,並共用成員方法,那麼一個成員方法,如何區分不同對象的數據?

用this指針,是類成員函數默認的第一個參數,是對象的地址,傳參的時候一般省略。

全局函數沒有this指針。

void registerGoods(CGoods *this,char *n,int a,double g)
{
    strcpy(_name,n);
    //strcpy(this->_name, n);//這裏的this指針其實是該函數默認的第一個參數,
                             //是對象的地址,再傳參的時候省略了。
                             //畢竟從彙編來說,C++的彙編碼還是使用C的。
}

new與malloc:
1、malloc和free都是C語言的庫函數;         new和delete是運算符 (sizeof)      sizeof也是運算符

2、malloc是按字節分配內存的;                  new是按指定類型的個數分配內存的

3、malloc開闢的內存不帶初始化操作;       new開闢內存可以自帶初始化,會自動調用構造函數

4、malloc開闢內存失敗返回值是NULL;     new開闢內存會拋出bad_alloc類型的異常對象

5、free是需要傳入釋放內存的起始地址就可以;delete是需要區分釋放單個元素內存和數組內存的,在釋放數組內存時,delete和指針中間,要加上[],如 delete []p;當然delete與free在釋放完之後,都需將指針置爲空

如何處理拋出的異常:
try
{
    int *p = new int;   //有很多catch塊,拋出的異常,與那個catch相同進入哪個catch
} 
catch(const bad_alloc &err)      //正確方法,但實際上很少會出現這種情況,所以一般並不需要考慮
{
}

 簡單點理解:new先申請內存(底層用malloc實現),然後調用類型的構造函數(初始化成員)。

                       delete先調用析構函數(清理成員),然後釋放內存(底層用free實現)

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