天天看點

C++學習筆記9--引用引用的基本使用注意事項引用做函數參數引用做函數傳回值引用的本質常量引用

引用

  • 引用的基本使用
  • 注意事項
  • 引用做函數參數
  • 引用做函數傳回值
  • 引用的本質
  • 常量引用

引用的基本使用

作用:給變量起别名

文法:

資料類型 &别名=原名
           
int main() {

	//引用基本文法
	//資料類型  &别名 =  原名

	int a = 10;
	//建立引用
	int &b = a;
	cout << "a = " << a << endl;
	cout << "b = " << b << endl;

	b = 100;
	cout << "a = " << a << endl;
	cout << "b = " << b << endl;

	return 0;
}
           

别名和原名指向同一塊記憶體

修改别名或者原名,對應的原名和别名也會做相應修改

C++學習筆記9--引用引用的基本使用注意事項引用做函數參數引用做函數傳回值引用的本質常量引用

注意事項

  • 引用必須初始化
  • 引用在初始化後,不可以改變
int main() {
	 
	int a = 10;
	
	//1、引用必須初始化
	//int &b; // 錯誤,必須要初始化
	int &b = a;

	//2、引用在初始化後,不可以改變
	int c = 20;

	b = c; // 指派操作,而不是更改引用

	cout << "a = " << a << endl;
	cout << "b = " << b << endl;
	cout << "c = " << c << endl;

	return 0;
}
           
C++學習筆記9--引用引用的基本使用注意事項引用做函數參數引用做函數傳回值引用的本質常量引用

引用做函數參數

作用:函數傳參時,可以利用引用的技術讓形參修飾實參

優點:可以簡化指針修改實參

交換函數

  • 1、值傳遞
  • 值傳遞,形參不會修飾實參
void mySwap01(int a, int b)
{
	int temp = a;
	a = b; 
	b = temp;
}
int main() {

	int a = 10;
	int b = 20;

	mySwap01(a, b); //值傳遞 ,形參不會修飾實參
	cout << "值傳遞時的交換結果:" << endl;
	cout << "a = " << a << endl;
	cout << "b = " << b << endl;

	return 0;
}
           
C++學習筆記9--引用引用的基本使用注意事項引用做函數參數引用做函數傳回值引用的本質常量引用
  • 2、位址傳遞
  • 位址傳遞,形參會修飾實參的
void mySwap02(int *a , int *b)
{
	int temp = *a;
	*a = *b;
	*b = temp;
}
int main() {

	int a = 10;
	int b = 20;

	mySwap02(&a, &b); //位址傳遞,形參會修飾實參的
	cout << "位址傳遞時的交換結果:" << endl;
	cout << "a = " << a << endl;
	cout << "b = " << b << endl;

	return 0;
}
           
C++學習筆記9--引用引用的基本使用注意事項引用做函數參數引用做函數傳回值引用的本質常量引用
  • 3、引用傳遞
  • 引用傳遞,形參會修飾實參
void mySwap03(int &a , int &b)
{
	int temp = a;
	a = b;
	b = temp;
}

int main() {

	int a = 10;
	int b = 20;

	mySwap03(a, b); //引用傳遞,形參會修飾實參的
	cout << "引用傳遞時的交換結果:" << endl;
	cout << "a = " << a << endl;
	cout << "b = " << b << endl;
	
	return 0;
}
           
C++學習筆記9--引用引用的基本使用注意事項引用做函數參數引用做函數傳回值引用的本質常量引用

引用做函數傳回值

作用:引用是可以作為函數的傳回值存在的

注意:不要傳回局部變量引用

用法:函數調用作為左值

引用做函數的傳回值

  • 1、不要傳回局部變量的引用
int& test01()  傳回值類型加上 & 相當于以 引用 的方式進行傳回
{
	int a = 10; //局部變量存放在四區中的 棧區
	return a;
}

int main() 
{
	int &ref = test01();  建立一個引用 ref, 将 test01()的傳回值賦給 ref 
	cout << "ref = " << ref << endl; //第一次結果正确,是因為編譯器做了保留
    cout << "ref = " << ref << endl; //第二次結果錯誤,因為a的記憶體已經釋放
    
	return 0;
}
           
C++學習筆記9--引用引用的基本使用注意事項引用做函數參數引用做函數傳回值引用的本質常量引用
  • 2、函數的調用可以作為左值
int& test02()
{
	static int a = 10;  靜态變量,存放在全局區,全局區上的資料在程式結束後系統釋放
	return a;
}

int main() 
{

	int &ref2 = test02();
	cout << "ref2 = " << ref2 << endl;
	cout << "ref2 = " << ref2 << endl;

	test02() = 1000;  
	如果函數的傳回值是引用,這個函數調用可以作為左值
	相當于  a = 1000; ,ref2 本身是 a 的别名,是以,ref2 也是1000
	
	cout << "ref2 = " << ref2 << endl;
	cout << "ref2 = " << ref2 << endl;
	
	return 0;
}
           
C++學習筆記9--引用引用的基本使用注意事項引用做函數參數引用做函數傳回值引用的本質常量引用

引用的本質

本質:引用的本質在 C++ 内部實作是一個 指針常量

指針常量:指針的指向不可以改,指針指向的值可以改

C++學習筆記6: 指針.

// 發現是引用,轉換為 int * const ref  = &a;
void func(int& ref)
{
	ref = 100;  // ref 是引用,轉換為 *ref = 100
}

int main()
{
	int a = 10;

	自動轉換為 int * const ref = &a; 指針常量是指針指向不可以改,也說明為什麼引用不可更改
	int& ref = a;
	ref = 20;  // 内部發現 ref 是引用,自動轉換為 *ref  = 20;
	
	cout << "a: " << a << endl;
	cout << "rerf:" << ref << endl;

	func(a);
	system("pause");
	return 0;
}
           
C++學習筆記9--引用引用的基本使用注意事項引用做函數參數引用做函數傳回值引用的本質常量引用

結論:

C++推薦用引用技術,因為文法友善,引用本質是指針常量,

但是所有的指針操作編譯器都幫我們做了

常量引用

作用:常量引用主要用來修飾形參,防止誤操作

在函數形參清單中,可以加 const 修飾形參,防止形參改變實參

int a = 10;
int & ref = 10;  //  錯誤。引用必須引一塊合法的記憶體空間

// 加上 const 之後,編譯器将代碼 修改為  int temp  = 10;  const int & ref = temp;
const int & ref = 10;  // 正确。
ref = 20;// 錯誤,加上const之後變為隻讀,不可再更改
           
常量引用
用來修飾形參,防止誤操作

//列印資料函數
void showValue(const int &val)
{
	//val = 1000;  
	形參加 const  不可再修改,防止誤操作
	cout << "val = " << val << endl;
}

int main() 
{
	int a = 100;
	showValue(a);

	cout << "a = " << a << endl; 

	system("pause");

	return 0;
}
           

繼續閱讀