第9章 引用

1. 引用就是別名。創建引用的方法:

int a;

int &b = a;

這樣,b就是a,改變b的內容就是改變a,對b取地址,也是a的地址。就相當於一個人有一個名字,還有一個暱稱一樣。

2. 引用不是指針,不可對引用重新指定。也就是對於上面的定義,

a=1;

b=2;

這兩句是正確的,對a(b)賦值。而

int c;

b=c;

這就是錯誤的了。

3. 我們對刪除或是沒有初始化的指針要指定爲空,但是引用不可,也就是引用創建時就要初始化。

4. 我們可以用引用來傳遞函數需要的參數,這樣可以達到指針的效果,就是在函數裏面對參數操作,就是對函數本體的操作。

void swap(int &x, int &y);

int main()

{

int a =5; b=10;

swap(a,b);

return 0;

}

void swap (int &rx, int &ry)

{

int temp;

temp = rx;

rx = ry;

ry = temp;

}

這樣運行後a和b的值就改變了。

5. 使用引用可以減少程序的開銷。因爲引用只是創建了個別名,並沒有重新創建變量。這樣在使用引用傳遞參數時可以減少很多開銷。因爲在按值傳遞時,程序會創建一個副本給函數,函數用這個副本進行操作,操作完成後,函數要返回這個副本的值,但是這個副本是局部變量,也就是只能在函數內部使用,函數一但返回,所有函數內部的局部變量都要銷燬,那麼程序只能再創建一個副本來返回這個值。這樣的話就會多出很多開銷。但是如果按引用傳遞,在傳遞時函數就不用創建副本,返回時也不用,就可以減少開銷。

6. 傳遞給函數指針效率固然是高,但有的時候也回存在危險。好比傳遞給函數的指針所指的數據,並不希望函數對它有一些改變,也就是希望這個指針對於函數是隻讀的,這是就用到const指針了。

class simplecat

{

public:

simplecat();

simplecat(simplecat&);

~simplecat();

int get age() const{return itsage;}

void setage(int age){itsage=age;}

private:

int itsage;

};

 

const simplecat * const functionone

(const simplecat * const thecat);

int main()

{

simplecat frisky;

int age=5;

frisky.setage(age);

functionone(&frisky);

return 0;

}

const simlecat * const functionone

(const simplecat * const thecat)

{

thecat->getage();

//thecat->setage(8);

return thecat;

}

在functionon裏面被註釋掉的一句thecat->setage(8);是不能在這個程序中運行的,因爲生命functionone時用了const,這表明thecat在這個函數運行完後,起內容是不能改變的,你可以查看,但是不能改變。所以如果有thecat->setage(8)這句話的話,程序是編譯不過的。

7. 對於6的程序,我們可以用引用來代替指針,那麼只需改變這幾個地方:

const simplecat & functionone(const simplecat & thecat);

...

int main()

{

...

function(frisky);

..

}

const simplecat & functionone(const simplecat & thecat)

...

 8.指向simple對象的const引用和指向const simple的引用,這兩個和指針不同,這兩個是沒有區別的。因爲引用本身就是const的,不能爲其重新賦值

9.如果沒有足夠內存分配,new將返回空指針

 

下章見(以上全是個人觀點,如有不當,敬請提出)

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