文章目錄
- 一、C++中的引用
- (一)引用
- 1. 語法格式
- 2. 作用
- 3. 注意事項
- (二)常引用
- 2. 其他場景
- (三)引用和函數結合使用
- 1. 引用可以作為函數的參數
- 2. 引用可以作為函數的返回值
- (四)引用和指針的區別
- 二、C++中的動態內存分配
- (一)
- (二)malloc/free和new/delete
- (三)使用示例
一、C++中的引用
引用是對引用目標起別名,類似于Linux中的硬鏈接;
(一)引用
1. 語法格式
數據類型 &引用名 = 引用目標;
eg: int &a1 = a;
- 注:
&
是一個引用的標識;&
在引用中使用表示的是引用的一個標識;
在兩個操作數之間使用表示按位與(a & b
);
在其他場合下表示取地址(&a
)
2. 作用
節省內存開銷:在給函數傳遞參數時,形參需要額外的開辟空間,但是使用引用后就可以節省形參的空間
不使用引用:
int func(int a,int b){cout << "a="<<a<<" b="<<b<<endl;cout << "&a="<<&a<<" &b="<<b<<endl;return a+b;}int main(){int a = 5,b=10;cout << "a="<<a<<" b="<<b<<endl;cout << "&a="<<&a<<" &b="<<b<<endl;cout << "--------------------"<<endl;func(a,b);}
從下面運行結果可知,形參會分配新的內存空間
使用引用:
int func(int &a,int &b){cout << "a="<<a<<" b="<<b<<endl;cout << "&a="<<&a<<" &b="<<b<<endl;return a+b;}int main(){int a = 5,b=10;cout << "a="<<a<<" b="<<b<<endl;cout << "&a="<<&a<<" &b="<<b<<endl;cout << "--------------------"<<endl;func(a,b);}
從下面結果可知,使用引用后,并未給形參分配新的內存空間
3. 注意事項
- 引用在定義時必須要有引用的目標
- 引用的數據類型 和 引用的目標的數據類型 必須保持一致
- 引用目標一旦綁定不可修改
int a = 5;
int &a1 = a;
int b = 10;
a1 = b;//這種寫法是簡單的賦值操作,而非修改綁定目標
(二)常引用
用const修飾的引用是一個常引用,以下兩種使用均可以
const 數據類型 &引用名 = 引用目標;
數據類型 const &引用名 = 引用目標;
常引用不能通過引用來修改引用目標的值,可以通過引用目標自身進行修改。
int a=111;
int &a1=a;
a1=222;//此時就會報錯
- 注:以下寫法是錯誤的:
數據類型 &const 引用名 = 引用目標;
因為引用一旦綁定,后續無法修改。
2. 其他場景
- 普通引用不能修飾常量,只有常引用可以修飾常量;
int &a=100; //報錯
const int &b=100;
- 普通引用不能修飾臨時值,常引用可以修飾臨時值
int x=10;
int &a = 5+x;
const int &b=5+x;
(三)引用和函數結合使用
1. 引用可以作為函數的參數
兩個數交換位置,傳值、傳地址、傳引用的區別
#include <iostream>
using namespace std;
int swap1(int a,int b){int temp=a;a=b;b=temp;
}
int swap2(int *a,int *b){int temp=*a;*a=*b;*b=temp;
}
int swap3(int &a,int &b){int temp=a;a=b;b=temp;
}
int main(){int a=100,b=200;swap1(a,b);//傳值cout<<"a="<<a<<" b="<<b<<endl;swap2(&a,&b);//傳地址cout<<"a="<<a<<" b="<<b<<endl;swap3(a,b);//傳引用cout<<"a="<<a<<" b="<<b<<endl;
}
在實際開發中,采用哪種方法根據實際需求決定
2. 引用可以作為函數的返回值
格式:
數據類型& 函數名(形參表){函數體;
}
- 注:
- 引用不可返回局部變量;可以返回全局變量或者使用static修飾的變量
- 常見的函數返回值是一個右值,引用作為返回值是一個左值。
(四)引用和指針的區別
二、C++中的動態內存分配
(一)
C++仍然支持malloc/free操作,但是一般在C++中使用new/delete
(二)malloc/free和new/delete
(三)使用示例
要求:從堆區申請一塊連續空間,在終端上輸入學生成績,并求出成績的最高分和最低分,以及成績之和