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將返回空指針
下章見(以上全是個人觀點,如有不當,敬請提出)