標籤:block 數組名 out 題解 規則 對象 傳遞 cpu fun
目錄
- C++之引用
- 1、什麼是引用
- 2、為何引入引用
- 3、引用的規則
- 4、變數的引用及舉例
- 4.3、陣列變數的引用
- 5、常引用及舉例(關鍵字const)
C++之引用1、什麼是引用
引用,就是為一個事物(變數、資料類型)起一個別名。實際中變數名它本身是一段記憶體的引用,即為該段記憶體起了一個名稱,該段記憶體的名稱 = 定義的變數名。
2、為何引入引用
- C++引入引用後,取代了指標傳遞參數的問題,引用就是完完全全相等的值傳遞。
- C裡面參數的傳遞是通過指標,當實參是數組時,此時用指標傳遞形式參數時,其實指標已經退化。(詳解陣列變數的引用)。
3、引用的規則
3.1 、 引用是一種關係型聲明,而非定義。不能獨立存在,必須初始化,且與原類型保持一致, 且不分配記憶體。
//錯誤寫法 //正確寫法 int a; int a; int &mya; int &mya = a; //引用本質是聲明,不能先定義,後賦值。
3.2 、 引用聲明關係,一經聲明,不可變更。
//錯誤寫法 //正確寫法 int a,b; int a,b; int &mya = a; int &mya = a; int &mya = b; int &myb = a;
3.3 、 引用可再次引用,多次引用的結果是某一變數具有多個別名, 多個別名間是平行關係。
int a; int &mya = a; int &myaa = a;
3.4 、 辨別引用與其它, &前有資料類型時或&在賦值號=左邊即為引用,其它皆為取地址或按位與。
4、變數的引用及舉例
4.1、 一般變數的引用
int a; int &mya = a; //此時操作mya完全就是操作a
4.2、指標變數的引用
int *p; int * &myp = p;
存在問題:引用的指標是否存在?
//不存在下列寫法 int *p; int * &myp = p; //myp是一個指標的引用 int & * prp = &myp; //&myp是指引用的地址 引用的本質是指標, C++對裸露的記憶體位址(指標)作了一次封裝。又取得了指標的優良特性。所以再對引用取地址,建立引用的指標無意義。
4.3、變數的多次引用
//即為一個變數起多個別名 int a; int &mya = a; int &myaa = a;
//不存在下列寫法int a;int & rz = a;int && rrz = rz;
4.3、陣列變數的引用
#include <iostream>using namespace std;void fun(int (&data)[3]){ printf("sizeof(ra) = %d\n",sizeof(data)); //輸出:12}void fun1(int *const &data){ printf("sizeof(pr) = %d\n",sizeof(data)); //輸出:4}int main(){ int array[3]; fun(array); fun1(array); return 0;}
總結:數組引用的形參的兩種表現形式
int (&data)[3] //數組引用的標準形式值傳遞,sizeof(data) = 4*3=12。
int *const &data //其實已經退化為指標的引用,sizeof(data) = 4。
1、這裡必須要加const,因為數組名是一個const的類型;
2、當數組引用時不能運算元組的引用名稱如:data = 2;
3、因為引用data是const類型的,只能操作引用內容:data[x] = 2。
存在問題:引用數組是否存在?
問題解析:不存在引用數組,引用只是聲明,在記憶體中不分配記憶體,而數組是要分配記憶體的,這與引用的定義不符。
int &a[2] = {a,b} //錯誤寫法。
5、常引用及舉例(關鍵字const)
概念:const 的本意,即不可修改。所以const變數或者對象,只能聲明為 const 引用,使其語義保持一致性。
1、 non-const變數或者對象,既可以聲明為 const 引用,也可以聲明為 no-const引用。聲明為 const 引用,則不可以通過 const 引用修改資料。
//non-const引用int data;int &rd = data;rd = 5;//const引用int data;const int &rd1 = data;//rd = 6; 聲明為 const 引用,則不可以通過 const 引用修改資料。
2、const變數或者對象必須聲明為const引用。
const int val = 10; int & rv = val; //錯誤寫法 const int & rv2 = val; //正確寫法
5.1、臨時對象的常引用
臨時對象:通常不可以取地址的對象,Cpu在運行計算中產生的中間變數,通常也稱為右值。常見臨時對象有常量,運算式等。
#include <iostream>using namespace std;//臨時變數 即不可取地址的對象#include <iostream>using namespace std;//臨時變數 即不可取地址的對象//常量 運算式 函數傳回值 類型不同的變數int foo(){ int a = 100; return a;}int main1(){ //常量 const int & cc = 55; cout<<cc<<endl; //運算式 int a = 3; int b = 5; const int &ret = a+b; //函數傳回值 const int& ra = foo(); //類型不同的變數 double d = 100.12; const int &rd = d; }int main1(){ //常量 const int & cc = 55; cout<<cc<<endl; //運算式 int a = 3; int b = 5; const int &ret = a+b; //函數傳回值 const int& ra = foo(); //類型不同的變數 double d = 100.12; const int &rd = d; return 0;}
#include <iostream>using namespace std;int main(){ double d = 3.14; const int & rd = d; cout<<"d = "<<d<<endl; cout<<"rd = "<<rd<<endl; d = 4.14; cout<<"d = "<<d<<endl; cout<<"rd = "<<rd<<endl; return 0;}輸出結果: 3.14 3 4.14 3
存在問題:為何臨時變數都改變了,引用變數的內容還保持第一次的值?
問題解析:本質上 const 引用,引用了一個不可改變的臨時變數, const int tmp = data;const int &rd = tmp; 此時,我們改變了 data 的值,臨時變數的值也不會改變。
C++之引用