引用為變量提供別名,最重要的用途之一是在給函數傳遞參數方面
注意:引用作為函數的形參時不需要初始化!
引用作為變量的別名而存在,因此有一些場合可以代替指針
引用相當於指針來說具有更好的可讀性和使用性
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; }