反射與依賴注入
阿新 • • 發佈:2021-10-13
引用
引用的基本使用
語法:資料型別 &別名 = 原名
示例:
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; }
引用注意事項
- 引用必須初始化
- 引用在初始化後,不可以改變
示例:
int main(){ int a = 10; int b = 20; //int &c; //錯誤,引用必須初始化 int &c = a;//一旦初始化後, 就不可以更改 c = b; //這是賦值操作,不是更改引用 cout << "a = " << a << endl; cout << "b = " << b << endl; cout << "c = " << c << endl; system("pause"); return 0; }
引用做函式引數
作用:函式傳參時,可以利用引用的技術讓形參修飾實參
優點:可以簡化指標修改實參
示例:
//1.值傳遞 void mySwap01(int a, int b){ int temp = a; a = b; b = temp; } //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); cout << "a:" << a << " b:" << b << endl; mySwap02(&a, &b); cout << "a:" << a << " b:" << b << endl; mySwap03(a, b); cout << "a:" << a << " b:" << b << endl; system("pause"); return 0; }
總結 :通過引用引數產生的效果同按地址傳遞是一樣的。引用的語法更清楚簡單
引用做函式返回值
作用:引用是可以作為函式的返回值存在的
注意:不要返回區域性變數引用
用法:函式呼叫作為左值
示例:
//返回區域性變數
int &test01(){
int a = 10; //區域性變數
return a;
}
//返回靜態變數引用
int &test02(){
static int a =20;
return a;
}
int main(){
//不能返回區域性變數的引用
int &ref01 = test01();
cout << "ref01 = " << ref01 << endl;
cout << "ref01 = " << ref01 << endl;//錯誤,亂碼
//如果函式做左值,那麼必須返回引用
int &ref02 = test02();
cout << "ref02 = " << ref02 << endl;
cout << "ref02 = " << ref02 << endl;
test02() = 1000;
cout << "ref02 = " << ref02 << endl;
cout << "ref02 = " << ref02 << endl;
system("pause");
return 0;
}
引用的本質
本質:引用的本質在c++內部實現是一個指標常量
示例:
//發現是引用,轉換為 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 << "ref:" << ref << endl;
func(a);
return 0;
}
結論 :C++推薦引用技術,因為語法方便,引用本質是指標常量,但是所有的指標操作編譯器都幫我們做了
常量引用
作用:常量引用主要用來修飾形參,防止誤操作
在函式形參列表中,可以加const修飾形參,防止形參改變實參
示例:
//引用使用的場景,通常用來修飾形參
void showValue(const int &v){
//v += 10;
cout << v << endl;
}
int main(){
//int &ref = 10; 引用本身需要一個合法的記憶體空間,因此這行執行錯誤
//加入const就可以了,編譯器優化程式碼,int temp = 10; const int &ref = temp;
const int &ref = 10;
//ref = 100; //加入const後不可以修改變數
cout << ref << endl;
//函式中利用常量引用防止誤操作修改實參
int a = 10;
showValue(a);
system("pause");
return 0;
}