歡迎關註公眾號:bin的技術小屋,如果大家在看文章的時候發現圖片載入不了,可以到公眾號查看原文 本系列Netty源碼解析文章基於 4.1.56.Final版本 最近在 Review Netty 代碼的時候,不小心用我的肉眼抓到了一個隱藏很深很深的記憶體泄露 Bug。 於是筆者將這個故事....哦不 . ...
2 引用
2.1 引用的基本使用
作用:給變數起別名
語法:數據類型 &別名 = 原名
示例:
#include<iostream>
using namespace std;
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;
system("pause");
return 0;
}
2.2 引用註意事項
- 引用必須初始化
- 引用在初始化後,就不可以改變
示例:
#include<iostream>
using namespace std;
int main()
{
int a = 10;
int& b = a;
//1、引用必須初始化
//int& b;//錯誤,必須要初始化
//2、引用在初始化後,不可以改變
int c = 20;
c = b;//這是賦值操作,不可以更改引用
cout << "a = " << a << endl;
cout << "b = " << b << endl;
cout << "c = " << c << endl;
system("pause");
return 0;
}
2.3 引用做函數參數
作用:函數傳參時,可以利用引用的技術讓形參修飾實參
優點:可以簡化指針修飾實參
示例:
#include<iostream>
using namespace std;
//交換函數
//1、值傳遞
void mySwap01(int a, int b)
{
int temp = a;
a = b;
b = temp;
cout << "swap01 a =" << a << endl;
cout << "swap01 b = " << b << endl;
}
//2、地址傳遞
void mySwap02(int* a, int* b)
{
int temp = *a;
*a = *b;
*b = temp;
}
//3、引用傳遞
void mySwap03(int& a, int& b)
{
int temp = a;
a = b;
b = temp;
}
int main()
{
int a = 10;
int b = 20;
//mySwap01(a, b);//值傳遞,形參不會修飾實參
//mySwap02(&a, &b);//地址傳遞,形參會修飾實參
mySwap03(a, b);//引用傳遞,他的形參也會修飾實參的
cout << "a =" << a << endl;
cout << "b = " << b << endl;
system("pause");
return 0;
}
總結:通過引用參數產生的效果同按地址傳遞是一樣的。引用的語法更清楚簡單
2.4 引用做函數返回值
作用:引用是可以作為函數的返回值存在的
註意:不要返回局部變數引用
用法:函數調用作為左值
示例:
#include<iostream>
using namespace std;
//引用做函數的返回值
//1、不要返回局部變數的引用
int& test01()
{
int a = 10;//局部變數存放在四區中的棧區
return a;
}
//2、函數的調用可以作為左值
int& test02()
{
static int a = 10;//靜態變數,存放在全局區,全局區的數據是在程式結束後由系統釋放
return a;
}
int main()
{
//int& ref1 = test01();
//cout << "ref1 = " << ref1 << endl;//第一次結果正確,是因為編譯器做了保留,也許也錯的
//cout << "ref1 = " << ref1 << endl;//第二次結果錯誤,是因為a的記憶體已經釋放
int& ref2 = test02();
cout << "ref2 = " << ref2 << endl;
cout << "ref2 = " << ref2 << endl;
test02() = 1000;
cout << "ref2 = " << ref2 << endl;
cout << "ref2 = " << ref2 << endl;
system("pause");
return 0;
}
2.5 引用的本質
本質:引用的本質在c++中內部的實現是一個指針常量
示例:
#include<iostream>
using namespace std;
void func(int& ref) {
ref = 100;//ref 是引用,
}
int main()
{
int a = 10;
//自動轉換為 int* const ref = &a;指針常量是指針指向不可改,也說明為什麼引用不可更改
int& ref = a;
ref = 20;//內部發現ref是引用,自動幫我們轉換為:*ref =20;
cout << "a:" << a << endl;
cout << "ref:" << ref << endl;
system("pause");
return 0;
}
2.6 常量引用
作用:常量引用主要用來修飾形參,防止誤操作
在函數形參列表中,可以加const修飾形參,防止形參改變實參
示例:
#include<iostream>
using namespace std;
//列印數據函數
void showValue(const int& val)
{
//val = 1000;//無法修改
cout << "val = " << val << endl;
}
int main()
{
////常量應用
////使用場景:用來修飾形參,防止誤操作
//int a = 10;
//int& ref = a;//引用必須引一塊合法的記憶體空間
////加上const之後,編譯器將代碼修改,int temp = 10;const int & ref =temp;
//const int& ref = 10;
////ref = 20;//不可以修改,加入const之後變為只讀,不可以修改
int a = 100;
showValue(a);
system("pause");
return 0;
}