最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++缺省參數(shù)、函數(shù)重載與引用深入解析

 更新時(shí)間:2024年04月11日 10:15:37   作者:大耳朵土土垚  
缺省參數(shù)函數(shù)重載以及引用的出現(xiàn)是為了補(bǔ)充C語言語法的不足以及對(duì)C語言設(shè)計(jì)不合理的地方進(jìn)行優(yōu)化,引用的出現(xiàn)大大降低了我們學(xué)習(xí)C語言時(shí)相對(duì)于指針的難度,也便于我們更好的理解和使用,感興趣的朋友一起看看吧

前言

1. 缺省參數(shù)

1.1 缺省參數(shù)概念

缺省參數(shù)是聲明或定義函數(shù)時(shí)為函數(shù)的參數(shù)指定一個(gè)缺省值。在調(diào)用該函數(shù)時(shí),如果沒有指定實(shí)參則采用該形參的缺省值,否則使用指定的實(shí)參。

#include<iostream>
using namespace std;//使用using namespace 命名空間名稱引入C++標(biāo)準(zhǔn)
void Func(int a = 0)
 {
 	cout<<a<<endl;
 }
 int main()
 {
	Func();     // 沒有傳參時(shí),使用參數(shù)的默認(rèn)值 
	Func(10);   // 傳參時(shí),使用指定的實(shí)參
	return 0;
 }

結(jié)果如下:

可以看到在定義void Func(int a = 0)時(shí)給int a 參數(shù)賦值為0;
所以當(dāng)使用該函數(shù)時(shí),如果不傳參數(shù):Func(); 就默認(rèn)傳的參數(shù)為之前定義時(shí)賦值的0;
如果傳參數(shù):Func(10); 就正常傳參即可;

注意:

缺省參數(shù)不能在函數(shù)聲明和定義中同時(shí)出現(xiàn)(寫在聲明中):

  • 缺省值必須是常量或者全局變量;
  • C語言不支持(編譯器不支持)缺省參數(shù);

1.2 缺省參數(shù)分類

全缺省參數(shù)

void Func(int a = 10, int b = 20, int c = 30)
 {
 cout<<"a = "<<a<<endl;
 cout<<"b = "<<b<<endl;
 cout<<"c = "<<c<<endl;
 }

全缺省參數(shù)就是指定義函數(shù)時(shí)將所有的參數(shù)都賦值

半缺省參數(shù)

void Func(int a, int b = 10, int c = 20)
 {
 cout<<"a = "<<a<<endl;
 cout<<"b = "<<b<<endl;
 cout<<"c = "<<c<<endl;
 }

半缺省參數(shù)就是指定義函數(shù)時(shí)將部分的參數(shù)賦值;
注意:半缺省參數(shù)必須從右往左依次連續(xù)來給出,中間不能有間隔;

2.函數(shù)重載

2.1函數(shù)重載概念

  • 函數(shù)重載:是函數(shù)的一種特殊情況,C++允許在同一作用域中聲明幾個(gè)功能類似的同名函數(shù),這些同名函數(shù)的形參列表(參數(shù)個(gè)數(shù)或類型或 類型順序)不同,常用來處理實(shí)現(xiàn)功能類似數(shù)據(jù)類型不同的問題。
  • 函數(shù)重載的優(yōu)點(diǎn)是能夠提高代碼的可讀性和可維護(hù)性。通過使用同一個(gè)函數(shù)名來表示一組相關(guān)的操作,可以讓調(diào)用者更容易理解代碼的意圖,并且減少了代碼的重復(fù)性。
  • 函數(shù)重載的條件是函數(shù)名相同,但是參數(shù)列表不同。參數(shù)列表可以包括參數(shù)的個(gè)數(shù)、類型、順序等方面的差異。在編譯器中,通過函數(shù)的參數(shù)列表來區(qū)分同名的函數(shù),并選擇合適的函數(shù)進(jìn)行調(diào)用。

例如:

#include<iostream>
using namespace std;
// 1、參數(shù)類型不同
int Add(int left, int right)
{
    cout << "int Add(int left, int right)" << endl;
    return left + right;
}
double Add(double left, double right)
{
    cout << "double Add(double left, double right)" << endl;
    return left + right;
}
// 2、參數(shù)個(gè)數(shù)不同
void f()
{
    cout << "f()" << endl;
}
void f(int a)
{
    cout << "f(int a)" << endl;
}
// 3、參數(shù)類型順序不同
void f(int a, char b)
{
    cout << "f(int a,char b)" << endl;
}
void f(char b, int a)
{
    cout << "f(char b, int a)" << endl;
}
int main()
{
    Add(10, 20);
    Add(10.1, 20.2);
    f();
    f(10);
    f(10, 'a');
    f('a', 10);
    return 0;
}

結(jié)果如下:

可以看到雖然函數(shù)名相同,但是對(duì)應(yīng)不同的參數(shù)會(huì)調(diào)用不同的函數(shù)

這里注意,相同類型的參數(shù)順序調(diào)換不構(gòu)成函數(shù)重載:

int Add(int left, int right)
{
    cout << "int Add(int left, int right)" << endl;
    return left + right;
}
int Add(int right, int left)
{
    cout << "int Add(int left, int right)" << endl;
    return left + right;
}

結(jié)果如下:

當(dāng)然如果兩個(gè)函數(shù)函數(shù)名和參數(shù)是一樣的,返回值不同是不構(gòu)成重載的,因?yàn)檎{(diào)用時(shí)編譯器沒辦法區(qū)分。

2.2函數(shù)重載原因

C語言不支持函數(shù)重載的主要原因是它的編譯器在進(jìn)行函數(shù)調(diào)用時(shí)是根據(jù)函數(shù)名來確定具體調(diào)用的函數(shù)的,在編譯階段就已經(jīng)決定了函數(shù)的調(diào)用方式。而函數(shù)重載是指多個(gè)函數(shù)擁有相同的名稱但具有不同的參數(shù)列表,編譯器無法根據(jù)函數(shù)名來確定具體調(diào)用的函數(shù)。因此,C語言無法實(shí)現(xiàn)函數(shù)重載功能。

而C++是通過函數(shù)修飾規(guī)則來區(qū)分同名的函數(shù),只要參數(shù)不同,修飾出來的名字就不一樣,就支持了重載。

3.引用

3.1引用概念

  • 引用不是新定義一個(gè)變量,而是給已存在變量取了一個(gè)別名,編譯器不會(huì)為引用變量開辟內(nèi)存空間,它和它引用的變量共用同一塊內(nèi)存空間
  • 它允許我們使用一個(gè)變量名來引用另一個(gè)變量的值,而不是創(chuàng)建一個(gè)新的變量
  • 引用通常用于傳遞函數(shù)的參數(shù)、返回函數(shù)值和簡(jiǎn)化語法

在C++中,我們可以通過以下方式定義一個(gè)引用:

type &ref = variable;//類型&  引用變量名(對(duì)象名) = 被引用實(shí)體

例如:

void TestRef()
 {
 	 int a = 10;
	 int& ra = a;//<====定義引用類型
	 printf("%p\n", &a);
	 printf("%p\n", &ra);
 }

注意:引用類型必須和引用實(shí)體是同種類型的

再舉個(gè)例子:

可以看到它們都是同一個(gè)地址,指向同一個(gè)變量

#include <iostream>
int main() {
    int num = 10;
    int &ref = num; // 引用num變量
    std::cout << "num: " << num << std::endl;
    std::cout << "ref: " << ref << std::endl;
    num = 20;
    std::cout << "num: " << num << std::endl;
    std::cout << "ref: " << ref << std::endl;
    ref = 30;
    std::cout << "num: " << num << std::endl;
    std::cout << "ref: " << ref << std::endl;
    return 0;
}

結(jié)果如下:

num: 10
ref: 10
num: 20
ref: 20
num: 30
ref: 30

可以看到,無論我們通過num還是ref來修改變量的值,都會(huì)影響到另一個(gè)變量的值,因?yàn)樗鼈儗?shí)際上是同一個(gè)變量的不同名稱。

3.2引用特性

  • 引用在定義時(shí)必須初始化
  • 一個(gè)變量可以有多個(gè)引用
  • 引用一旦引用一個(gè)實(shí)體,再不能引用其他實(shí)體
void TestRef()
 {
	int a = 10;
    // int& ra;   // 該條語句編譯時(shí)會(huì)出錯(cuò)
	int& ra = a;
	int& rra = a;
	printf("%p  %p  %p\n", &a, &ra, &rra);  
}

結(jié)果如下:

3.2常引用

C++中的常引用有兩種情況:

const引用:使用const關(guān)鍵字來修飾引用,表示引用的值不可修改。例如:

int x = 10;
const int& ref = x;

在上面的例子中,ref是一個(gè)對(duì)x的常引用,意味著不能通過ref來修改x的值。

常對(duì)象的引用:當(dāng)引用一個(gè)常對(duì)象時(shí),引用也必須是常引用。例如:

const int x = 10;
const int& ref = x;

在上面的例子中,ref是對(duì)常對(duì)象x的常引用。

常引用的作用是為了在不修改值的情況下使用對(duì)象,同時(shí)可以避免不必要的復(fù)制。常引用經(jīng)常用于函數(shù)參數(shù)中,以便避免對(duì)實(shí)參進(jìn)行復(fù)制。

指針和引用進(jìn)行賦值和初始化時(shí),權(quán)限可以縮小,但是不能放大

例如:

const int x = 10;
int& ref = x;//這是錯(cuò)誤的,它放大了權(quán)限

在上面的例子中,原本的x被const修飾不能被改變數(shù)據(jù),但是ref引用它時(shí)沒有用const修飾說明可以被改動(dòng),放大了權(quán)限是不被接受的;這和指針是類似的:const int* p1 = NULL; int* p2 = p1;//這也是錯(cuò)誤的

3.3使用場(chǎng)景

做參數(shù)

void Swap(int& left, int& right)
 {
 int temp = left;
 left = right;
 right = temp;
 }

結(jié)果如下:

可以看到我們沒有使用傳遞變量的指針給函數(shù)就改變了實(shí)參的數(shù)據(jù);

使用引用作為函數(shù)參數(shù)可以避免復(fù)制大量的數(shù)據(jù),提高函數(shù)的效率。同時(shí),通過引用傳遞參數(shù)可以實(shí)現(xiàn)對(duì)原始數(shù)據(jù)的修改,而不需要借助指針來實(shí)現(xiàn)。

做返回值

引用作為函數(shù)的返回值前提是:返回的值在調(diào)用完函數(shù)后不會(huì)被釋放銷毀

例如:

int& Count()
 {
 static int n = 0;
 n++;
 return n;
 }

n用static修飾為靜態(tài)全局變量即使函數(shù)調(diào)用結(jié)束也不會(huì)被釋放,所以可以用引用作為函數(shù)的返回值,這樣就不需要再臨時(shí)拷貝一份,減少了空間的消耗;

那么作為函數(shù)的返回值有什么作用呢?
舉個(gè)例子:

#include<iostream>
#include<assert.h>
#define N 10
using namespace std;
//順序表
typedef struct AY
{
	int arr[N];
	int size;
}AY;
int& PosAt(AY& ay, int x)
{
	assert(x < N);
	return ay.arr[x];
}
int main()
{
	AY ay;
	for (int i = 0; i < N; i++)
	{
		PosAt(ay, i) = i;//利用引用返回修改對(duì)應(yīng)的值
	}
	for (int i = 0; i < N; i++)//打印
	{
		cout << PosAt(ay, i) << " ";
	}
	cout << endl;
	return 0;
}

結(jié)果如下:

從上面的函數(shù)我們可以知道引用返回除了可以減少拷貝還可以修改返回的對(duì)象;

總結(jié):如果函數(shù)返回時(shí),出了函數(shù)作用域,如果返回對(duì)象還在(還沒還給系統(tǒng)),則可以使用引用返回,如果已經(jīng)還給系統(tǒng)了,則必須使用傳值返回。

3.4引用和指針的區(qū)別

(1)在語法概念上引用就是一個(gè)別名,沒有獨(dú)立空間,和其引用實(shí)體共用同一塊空間;而指針是保存著變量的地址的,是有獨(dú)立的空間的;

例如:

int main()
 {
 int a = 10;
 int& ra = a;
 cout<<"&a = "<<&a<<endl;
 cout<<"&ra = "<<&ra<<endl;
 return 0;
 }

結(jié)果如下:

通過上述例子我們發(fā)現(xiàn)引用和原來的變量的地址是一樣的;

(2)在底層實(shí)現(xiàn)上實(shí)際是有空間的,因?yàn)橐檬前凑罩羔樂绞絹韺?shí)現(xiàn)的;

例如:

#include<iostream>
using namespace std;
int main()
{
	int a = 10;
	int& ra = a;
	ra = 20;
	int* pa = &a;
	*pa = 20;
	return 0;
}

結(jié)果如下:

通過上述例子,我們調(diào)試查看反匯編,發(fā)現(xiàn)引用和指針操作底層邏輯是一樣的;

(3)引用和指針的不同:

  • 引用概念上定義一個(gè)變量的別名,指針存儲(chǔ)一個(gè)變量地址;
  • 引用在定義時(shí)必須初始化,指針沒有要求;
  • 引用在初始化時(shí)引用一個(gè)實(shí)體后,就不能再引用其他實(shí)體,而指針可以在任何時(shí)候指向任何一個(gè)同類型實(shí)體;
  • 沒有NULL引用,但有NULL指針;
  • 在sizeof中含義不同:引用結(jié)果為引用類型的大小,但指針始終是地址空間所占字節(jié)個(gè)數(shù)(32位平臺(tái)下占4個(gè)字節(jié));
  • 引用自加即引用的實(shí)體增加1,指針自加即指針向后偏移一個(gè)類型的大小;
  • 有多級(jí)指針,但是沒有多級(jí)引用;
  • 訪問實(shí)體方式不同,指針需要顯式解引用,引用編譯器自己處理;
  • 引用比指針使用起來相對(duì)更安全;

4.結(jié)語

以上就是C++中缺省參數(shù)、函數(shù)重載以及引用的所有內(nèi)容啦 ~,缺省參數(shù)函數(shù)重載以及引用的出現(xiàn)是為了補(bǔ)充C語言語法的不足以及對(duì)C語言設(shè)計(jì)不合理的地方進(jìn)行優(yōu)化,引用的出現(xiàn)大大降低了我們學(xué)習(xí)C語言時(shí)相對(duì)于指針的難度,也便于我們更好的理解和使用,完結(jié)撒花 ~??????????

到此這篇關(guān)于C++缺省參數(shù)、函數(shù)重載與引用的文章就介紹到這了,更多相關(guān)C++缺省參數(shù)、函數(shù)重載內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C++深入分析講解智能指針

    C++深入分析講解智能指針

    為了解決內(nèi)存泄漏的問題,C++中提出了智能指針。內(nèi)存泄漏的產(chǎn)生原因有很多,即使我們正確的使用malloc和free關(guān)鍵字也有可能產(chǎn)生內(nèi)存泄漏,如在malloc和free之間如果存在拋異常,那也會(huì)產(chǎn)生內(nèi)存泄漏。這種問題被稱為異常安全
    2022-05-05
  • C++標(biāo)準(zhǔn)模板庫STL的介紹

    C++標(biāo)準(zhǔn)模板庫STL的介紹

    今天小編就為大家分享一篇關(guān)于C++標(biāo)準(zhǔn)模板庫STL的介紹,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2018-12-12
  • C語言編程之預(yù)處理過程與define及條件編譯

    C語言編程之預(yù)處理過程與define及條件編譯

    這篇文章主要為大家介紹了C語言編程之預(yù)處理過程與define及條件編譯,文中通過圖文及示例代碼方式作了詳細(xì)的解釋,有需要的朋友可以借鑒參考下
    2021-09-09
  • C++名稱空間特性

    C++名稱空間特性

    這篇文章主要介紹了C++名稱空間特性,文章圍繞C++名稱空間特性的相關(guān)資料展開詳細(xì)內(nèi)容,需要的小伙伴可以參考一下下文具體內(nèi)容,希望對(duì)你的學(xué)習(xí)有所幫助
    2022-01-01
  • 淺談C語言Free空指針會(huì)怎樣

    淺談C語言Free空指針會(huì)怎樣

    在C語言中,使用free函數(shù)釋放一個(gè)空指針是安全的,不會(huì)引發(fā)任何錯(cuò)誤或異常,本文就來詳細(xì)的介紹一下,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-10-10
  • C語言數(shù)據(jù)結(jié)構(gòu)與算法之鏈表(二)

    C語言數(shù)據(jù)結(jié)構(gòu)與算法之鏈表(二)

    在這篇文章中,我們將拋開令人頭禿的指針和結(jié)構(gòu)體,我們將另外使用一種數(shù)組來實(shí)現(xiàn)的方式,叫做模擬鏈表。讓來跟隨小編一起學(xué)習(xí)學(xué)習(xí)吧
    2021-12-12
  • C語言實(shí)現(xiàn)統(tǒng)計(jì)100以內(nèi)所有素?cái)?shù)的個(gè)數(shù)

    C語言實(shí)現(xiàn)統(tǒng)計(jì)100以內(nèi)所有素?cái)?shù)的個(gè)數(shù)

    本文詳細(xì)講解了C語言實(shí)現(xiàn)統(tǒng)計(jì)100以內(nèi)所有素?cái)?shù)個(gè)數(shù)的方法,文中通過示例代碼介紹的非常詳細(xì)。需要的朋友可以收藏下,方便下次瀏覽觀看
    2021-11-11
  • C++ Dijkstra算法之求圖中任意兩頂點(diǎn)的最短路徑

    C++ Dijkstra算法之求圖中任意兩頂點(diǎn)的最短路徑

    這篇文章主要為大家詳細(xì)介紹了用C++經(jīng)典算法-Dijkstra算法求任意兩頂點(diǎn)之間的最短路徑,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • C++使用new和delete進(jìn)行動(dòng)態(tài)內(nèi)存分配與數(shù)組封裝

    C++使用new和delete進(jìn)行動(dòng)態(tài)內(nèi)存分配與數(shù)組封裝

    這篇文章主要介紹了C++使用new和delete進(jìn)行動(dòng)態(tài)內(nèi)存分配與數(shù)組封裝,運(yùn)行期間才能確定所需內(nèi)存大小,此時(shí)應(yīng)該使用new申請(qǐng)內(nèi)存,下面我們就進(jìn)入文章學(xué)習(xí)具體的操作方法,需要的小伙伴可以參考一下
    2022-03-03
  • C語言中關(guān)于scanf讀取緩存區(qū)的問題

    C語言中關(guān)于scanf讀取緩存區(qū)的問題

    scanf()函數(shù)是通用終端格式化輸入函數(shù),它從標(biāo)準(zhǔn)輸入設(shè)備(鍵盤) 讀取輸入的信息,接下來通過本文給大家介紹C語言中關(guān)于scanf讀取緩存區(qū)的問題,需要的朋友一起看看吧
    2021-09-09

最新評(píng)論

仁怀市| 无极县| 白河县| 海口市| 西乌| 望奎县| 克山县| 皮山县| 襄垣县| 屏东县| 宜丰县| 资阳市| 临沭县| 玉环县| 五家渠市| 汾阳市| 方正县| 建阳市| 临颍县| 新巴尔虎右旗| 横峰县| 科技| 祥云县| 精河县| 浦县| 九龙城区| 土默特左旗| 蒙城县| 乐东| 荥经县| 甘德县| 社旗县| 黎城县| 金山区| 蒙自县| 宿迁市| 西和县| 尚志市| 普安县| 明星| 淳安县|