C++(常)引用,const,指標引用__C++

來源:互聯網
上載者:User

一、引用
1.基本引用文法

/*變數引用*/int i = 10;int & s = i;//聲明引用變數s,引用了i,則後續對s或者i變動都會導致s和i的值變動。此時s和i等價//聲明一個引用,不是新定義了一個變數,它只表示該引用名是目標變數名的一個別名,它本身不是一種資料類型,因此引用本身不佔儲存單元,系統也不給引用分配儲存單元。故:對引用求地址,就是對目標變數求地址。&s與&i相等。從而減少記憶體空間和提高運行效率。這就是引用最大的好處。

2.引用作為函數參數,這裡的主要好處是,在進行主函數調用的時候,不需要給形參賦值,分配空間,而是直接對實參進行操作。這樣節省了空間和提高了效率。
雖然指標也能達到此類效果,但是仍然需要對指標變數進行賦值,需要佔據記憶體空間。

//定義對調函數,a,b為引用作為函數參數void swap(int &a, int &b){int c = a;a = b;b = c;}//定義主函數void main(){int m , n;cin>>m>>n;swap(m,n);//直接調用,無需實參變數任何要求。ps,這裡疑惑,不引用不也不用特殊要求嗎。。。cout<<m<<' '<<n<<endl;}

3 常引用
文法:const int &a = s;//這裡不能對a進行修改而改變s的值,但是可以改變s。

int main(){    int a = 20;    int const &s = a;//這裡const int &s =a效果等效。    cout << a << endl;    cout << s << endl;    a = 30;    //s = 40;//這裡不能賦值。。。因為s是常引用    cout << a << endl;    cout << s << endl;    return 0;}

4.引用作為函數的傳回值,這個最大的好處在於少佔用記憶體,因為沒有傳回值副本。
案例:

//引用作為函數傳回值,最大的好處是不用佔據記憶體(記憶體中不佔用傳回值副本)int swap1(int a, int b){    int temp = a;    a = b;    b = temp;    cout << "swap1" << endl;    return a / b;}//引用作為函數傳回值float &swap2(int a, int b) {    int temp = a;    a = b;    b = temp;    float c = (a*1.0) / b;    cout << "swap2" << endl;    return  c;}int main(){    int a = swap1(2, 3);    float b = swap2(2, 3);    cout << a << endl;    cout << b << endl;//  int &c = swap1(2, 3);//這裡錯誤,不能引用c    float &d = swap2(2, 3);//  cout << c << endl;    cout << d << endl;    return 0;}
區分幾種引用:
T*;T* const; const T*; const T* const; T&; T& const; const T&; const T& const;const T* &;T*const &

//這裡有個記憶的竅門:const靠近哪個,哪個就沒法更改。

//常指標與常引用#include"stdio.h"#include"iostream"using namespace std;int main(){//  T*;T* const; const T*; const T* const; T&; T& const; const T&; const T& const;const T* &;T*const &/*指標與常指標*/    int a = 18;    int b = 20;    int *p=&a;//表示T類型的指標p    int * const p1=&a;//這裡必須賦值,因為是常指標    cout << p1 << endl;//p1=00000000,64位編譯器    *p1 = 11;    cout << *p1 << endl;//    p1 = &b;//錯誤// 由上面可以看出int *const指標是個常指標,他只能指向一個固定的地方,可以修改這個固定地方的數字,但是不能再指向其他地方了。//  const int *p2;    int const *p2;//這兩種定義方式都可以    p2 = &a;    cout << p2 << endl;    p2 = &b;    cout << p2 << endl;//  *p2 = 25;//這裡錯誤,不能給p2重新賦值//由上面可以看出,const int *p2,表示指標指向的地方是常量,這個地方的值不能變更,但是指標可以指向其他地方。    const int * const p3=&a;//這裡必須直接賦值//  p3 = &a;//錯誤,相當於上面兩種情況都包括    cout << p3 << endl;    cout << *p3 << endl;//  p3 = &b;//錯誤,這裡p3是個常指標,他只能指向一個固定的地方,並且這個固定的地方也是常量,不可更改。    cout << p3 << endl;    cout << *p3 << endl;/*引用與常引用*/    int &c = a;//引用c和a等價,可以互相改變    c = 100;    cout << c << endl;    cout << a << endl;    a = 200;    cout << a << endl;    cout << c << endl;//    int & const d = a;//個人感覺這裡const沒啥用啊。等價於int &d=a;    d = 300;//a和d都是300    cout << d << endl;    cout << a << endl;    a = 500;    cout << d << endl;//d此時變成了500    cout << a << endl;    const int & e = a;//等價於int const &e=a//  e = 400;//錯誤,這裡e是常引用,不能更改    a = 400;//不可以該更改e的值,但是可以更改a的值從而更改e的值。    cout << e << endl;    cout << a << endl;    const int & const f=a;//f不能賦值,但是a卻可以賦值    cout << f << endl;    cout << a << endl;//  f = 1000;//不能對f進行賦值;f是常量。    cout << f << endl;    cout << a << endl;    a = 2000;    cout << f << endl;    cout << a << endl;//綜上所述,我們發現,即使常引用時候,不能改變引用的值,但是可以通過改變變數的值來改變常引用的值。這裡不理解,為什麼常引用應該是一個常數了,還能被更改。。// const T* &,這裡可以這麼看,const在*前面,表示指標指向內容不能改變,但是指標可以指向其他地方    const int *p10=&a;    const int *p11=&b;    const int * &p12 = p10;//p12為p10的引用    cout << p12 << endl;//輸出相同,因為p12為p10引用    cout << p10 << endl;//  *p12 = 4000;這裡錯誤,不能改變常指標指向的內容,但是可以指向其他地方    p12 = p11;    cout << p12 << endl;    cout << *p12 << endl;    cout << p11 << endl;    cout << *p11 << endl;//T * const &,const在指標之外,表示該引用只能指向一個固定的地方,但是這個固定地方值可以改    int *const p14=&a;      int *const p15 = &b;//聲明指標p14和p15指向a和b    int *const &p16 = p14;//引用,p16與p14等價,這裡p16隻能和p14一樣指向a,不能指向其他地方了。但是可以改變a的值。    cout << p16 << endl;    cout << p14 << endl;    cout << *p16 << endl;    cout << *p14 << endl;    *p16 = 1314;//*p14=1314一樣可以    cout << p16 << endl;    cout << p14 << endl;    cout << *p16 << endl;    cout << *p14 << endl;//  int *const &p16 = p15;//這裡錯誤,p16不能再指向其他地方了    cout << p15 << endl;    cout << p16 << endl;    cout << *p15 << endl;    cout << *p16 << endl;//T *const &    return 0;}

總結:由上述實驗可以發現,對於指標引用的話,const靠近哪裡,那裡無法更改。如int *const &p,則表示該p為常指標,其指向的地方不可更改,但是可以更改其指向地方的數字。或者理解為指標變數p為常數不可更改了。
int const *&p,const 距離指標星號較近,則表示該指標指向的地方為常數,不可更改。但是指標變數p可以指向其他地方。

//指標常引用套路int const *p1=&a;int const *p2=&b;int const *&p3=p1;int const *&p3=p2;

而對於變數的常引用,實驗發現 int const &a=b,int const &const a=b居然都可以通過改變b的值來改變a的值,但是這個時候單獨改變a不可以。這裡存在一點疑惑,但是實驗結果確實這麼證明的。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.