指針和引用

引用的概念:

引用不是定義一個新的變量,而是給一個已經定義的變量重新起一個別名。

引用定義的格式:

類型& 引用變量名 = 已定義過的變量名;
例如:

int a = 10;
int& b = a;//b是a的引用,b是a的別名

這裏寫圖片描述

引用的特點:

1.一個變量可以取多個別名
2.引用必須初始化
3.引用只能在初始化的時候引用一次,不能改變再引用其他變量

引用又可分爲const引用和非const引用

  • const引用只讀,與綁定對象是否爲const無關。
  • 非const引用可讀可寫,只可與非const對象綁定。
  • 非const引用只能綁定到與該引用同類型的對象,const引用則可以綁定到不同但相關的類型的對象或綁定到左值,const引用可以初始化爲不同類型的對象或者初始化爲右值,如字面值常量。
int d1 = 4;
const int &d2 = d1;
d1 = 5;    //d1改變,d2的值也會改變
//d2 = 6;  //不能給常量賦值

const int d3 = 1;
const int& d4 = d3;
//int& d5 = d3;
const int& d6 = 5;//常量具有常性,只有常引用可以引用常量

double d7 = 1.1;
//int& d8 = d7;//d7是double類型,d8是int類型,d7賦值給d8時要生成一個臨時變量
               //也就是說d8引用的是這個帶有常性的臨時變量,所以不能賦值
const int& d9 = d7;

在C++中有三種函數傳參的方式

1.值傳遞

如果形參爲非引用的傳值方式,則生成局部臨時變量接收實參的值,傳遞是單向的。如果在執行函數期間,形參的值發生變化,並不傳回給實參。因爲在調用函數時,形參和實參不是一個存儲單元。

2.引用傳遞

如果形參爲引用類型,則形參是實參的別名,和實參是一個變量,調用函數時,形參指向實參變量單元。這種通過形參引用可以改變實參的值。引用傳參可以減少空間浪費提高效率。

3.指針傳遞

如果形參是指針類型,實參是一個變量的地址,調用函數時,形參指向實參變量單元。這種通過形參指針可以改變實參的值。

引用做返回值

引用做返回值必須遵循以下規則:
1.不能返回局部變量的引用,局部變量會在函數返回後被銷燬

2.不能返回函數內部new分配的內存的引用,雖然不存在局部變量的被動銷燬問題,但是函數返回的引用只是作爲一個臨時變量出現,並沒有被賦予一個實際的變量,導致引用所指向的空間無法釋放,造成內存泄漏

3.可以返回類成員的引用,但最好是const。主要原因是當對象的屬性與某種業務規則相關聯的時候,其賦值常常與某些其他屬性或者對象的狀態相關聯,因此有必要將賦值操作封裝在一個業務規則中,如果其對象可以獲得該屬性的非常量引用(或指針),那麼對於該屬性的單純賦值就會破壞業務規則的完整性

4.引用與一些操作符的重載。流操作符<<和>>,這兩個操作符常常希望被連續使用,例如:cout<<”hello world”<<endl;因此這兩個操作符的返回值應該是一個仍然支持這兩個操作符的流引用。但+-*/四則運算符不能返回引用,需要返回一個對象

5.如果返回對象出了當前函數的作用域依舊存在,則最好使用引用返回,因爲這樣更高效

通過彙編看傳值返回和傳引用返回

#include<iostream>
//傳引用返回
int& Add(int d1, int d2)
{
    int ret = d1 + d2;
    return ret;
}
void Test()
{
    int& ret = Add(1, 2);
}
//傳值返回
int Add(int d1, int d2)
{
    int ret = d1 + d2;
    return ret;
}
void Test()
{
    int ret = Add(1, 2);
}

int main()
{
    Test();
    system("pause");
    return 0;
}

這裏寫圖片描述

這裏寫圖片描述

指針和引用的區別:

1.引用只能在定義時初始化1次,之後之後不能改變指向其他變量(從一而終);指針變量的值可變。

2.指針是一個實體,需要分配內存空間。引用只是變量的別名,不需要分配內存空間。

3.引用必須指向有效的變量,指針可以爲NULL。

4.sizeof指針對象和引用對象的意義不一樣,sizeof引用得到的是所指向的變量的大小,ersizeof指針是對象地址的大小。

5.指針和引用自增和自減意義不一樣。(指針是指向下一個空間,引用是引用的變量值+1)

6.引用訪問一個變量是直接訪問,而指針訪問一個變量是間接訪問。

7.相對而言,引用比指針更安全。

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