C++引用的本質


引用為變量提供別名,最重要的用途之一是在給函數傳遞參數方面

注意:引用作為函數的形參時不需要初始化!

 

引用作為變量的別名而存在,因此有一些場合可以代替指針

引用相當於指針來說具有更好的可讀性和使用性

 

swap.cpp

#include<stdio.h>

int swap(int &a, int &b)
{
    int temp;
    temp = b;
    b = a;
    a = temp;

}

int main(void)
{
    int a = 1;
    int b = 2;
    
    swap(a, b);
    
    printf("a = %d  b = %d \n", a, b);
    
    return 0;
}

 

C語言的交換函數:

#include<stdio.h>


int swap(int *a, int *b)
{

 int temp = *a;
 *a = *b;
 *b = temp;
 
 }
 
 int main(void)
 {
  int a = 1;
  int b = 2;
 
  swap(&a, &b);
 
  printf("a = %d b = %d\n", a, b);
  return 0;
 
 }

 

特殊的引用

const引用

-在C++中可以聲明const引用

-const TYPE& name = var;

-const引用讓變量擁有只讀屬性

int a = 4;

const &b = a;

int *p = (int*)&b;

b = 5;    //error 只讀變量

*p = 5;    //ok

結論: 使用常量對const引用初始化后將生成一個只讀變量!!

 

引用有自己的存儲空間嗎?

 

 

引用的實質是指針,旨在大部分情況下代替指針,

功能性:可以滿足指針的多數需要使用指針的場合,

安全性:可以避開由於指針操作不當帶來的內存錯誤

操作性:簡單易用,又不失強大

 

注意:不可以返回一個局部變量的引用

 

引用的一些疑問:引用和指針的區別

從使用C++語言角度來看:

引用和指針沒有任何關系;

引用是變量的新名字,操作引用就是操作對應的變量;

從C++編譯器的角度來看:

為了支持新概念,引用;必須要有一個有效的解決方案;

在編譯器內部,引用的實現是一個指針常量;

因此  “引用”在定義時必須初始化;

在工程項目開發中:

當進行C++編程時,直接站在使用的角度看待引用,與指針毫無關系;引用就是變量的別名;

當對C++代碼進行分析調試時;一些特殊情況,可以考慮站在C++編譯器的角度看待引用;

下面的代碼有問題嗎?

int a = 1;

int b = 2;

int *pc = new int(3);

int & array[] = {a, b, *pc};

答案:有問題,C++語言為了兼容c語言中數組的特性;數組是一片連續的,類型相同的內存空間; 而這里的數組引用,內存空間並不連續;所以,在C++中,引用數組不成立;

實例代碼如下:

#include<stdio.h>
int a = 1;

struct SV
{
    int& x;
    int& y;
    int& z;
};
int main()
{
    int b = 2;
    int* pc = new int(3);
    SV sv = {a, b, *pc};  
    int& array[] = {a, b, *pc}; //error:    in array: continus address; 
                                // but reference array destories that; so,in C++ doesn't support reference array; 

    printf("&sv.x = %p\n", &sv.x);
    printf("&sv.y = %p\n", &sv.y);
    printf("&sv.z = %p\n", &sv.z);
    delete pc;

    return 0;
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM