欧美free性护士vide0shd,老熟女,一区二区三区,久久久久夜夜夜精品国产,久久久久久综合网天天,欧美成人护士h版

目錄

柚子快報(bào)邀請(qǐng)碼778899分享:開(kāi)發(fā)語(yǔ)言 c++過(guò)渡知識(shí)2

柚子快報(bào)邀請(qǐng)碼778899分享:開(kāi)發(fā)語(yǔ)言 c++過(guò)渡知識(shí)2

http://yzkb.51969.com/

嗨咯,大家好,今天阿鑫給大家?guī)?lái)的是c++的過(guò)渡知識(shí)2,本篇屬于c++過(guò)渡知識(shí)的收尾哦,難度不是很大,下面請(qǐng)大家閱讀本篇博客吧!

c++過(guò)渡知識(shí)2

函數(shù)重載

函數(shù)重載的概念c++如何支持函數(shù)重載之名字修飾

初識(shí)引用

引用的概念引用特性細(xì)談引用和指針權(quán)限的放大與縮小

1.函數(shù)重載的概念

在c語(yǔ)言中不支持函數(shù)重載而在c++中支持函數(shù)重載 函數(shù)重載:是函數(shù)的一種特殊情況,C++允許在同一作用域中聲明幾個(gè)功能類似的同名函數(shù),這些同名函數(shù)的形參列表(參數(shù)個(gè)數(shù) 或 類型 或 類型順序)不同,常用來(lái)處理實(shí)現(xiàn)功能類似數(shù)據(jù)類型不同的問(wèn)題。 下面我們通過(guò)幾個(gè)例子來(lái)認(rèn)識(shí)一下函數(shù)重載的概念

#include

using namespace std;

void Swap(int* pa, int* pb)

{

cout << "void swap(int* pa, int* pb)" << endl;

}

void Swap(double* pa,double* pb)

{

cout << "void swap(double* pa,double* pb)" << endl;

}

int main()

{

int a = 1, b = 2;

double c = 0.1, d = 1.1;

Swap(&a, &b);

Swap(&c, &d);

return 0;

}

我們創(chuàng)建了兩個(gè)同名的函數(shù)Swap,這兩個(gè)函數(shù)同時(shí)在全局域中,但是由于這兩個(gè)函數(shù)形參部分的參數(shù)類型不同,所以構(gòu)成了重載函數(shù),并且在調(diào)用這兩個(gè)函數(shù)時(shí),編譯器會(huì)自動(dòng)進(jìn)行匹配

下面我們結(jié)合上一節(jié)提到的命名空間域的內(nèi)容創(chuàng)建三個(gè)函數(shù)

#include

using namespace std;

namespace ZJ1

{

void Swap(int* pa, int* pb)

{

cout << "void swap(int* pa, int* pb)" << endl;

}

}

namespace ZJ2

{

void Swap(int* px, int* py)

{

cout << "void swap(int* pa, int* pb)" << endl;

}

}

void Swap(double* pa,double* pb)

{

cout << "void swap(double* pa,double* pb)" << endl;

}

using namespace ZJ1;

using namespace ZJ2;

int main()

{

int a = 1, b = 2;

double c = 0.1, d = 1.1;

Swap(&a, &b);

Swap(&c, &d);

return 0;

}

當(dāng)我們?cè)趧?chuàng)建了這三個(gè)函數(shù)時(shí)進(jìn)行調(diào)用會(huì)報(bào)錯(cuò),下面請(qǐng)大家想想這是由于這兩個(gè)函數(shù)沒(méi)有構(gòu)成重載關(guān)系的緣故嗎?

實(shí)則不然,上節(jié)我們提到過(guò),不同作用域中的函數(shù)和變量是可以同名的,在這里我們這兩個(gè)函數(shù)分別封裝在ZJ1和ZJ2兩個(gè)域中,即使展開(kāi)了也是處于不同的作用域(注意:展開(kāi)并不是將函數(shù)放在全局處,而是在不指定的情況下,默認(rèn)編譯器也可以去命名空間域中搜索這個(gè)函數(shù)),并不是因?yàn)闆](méi)有構(gòu)成重載函數(shù)的原因而報(bào)錯(cuò) 實(shí)際原因是這兩個(gè)函數(shù)在調(diào)用過(guò)程中會(huì)發(fā)生歧義,導(dǎo)致編譯器既可以調(diào)用第一個(gè)函數(shù)也可以調(diào)用第二個(gè)函數(shù),所以我們?cè)谌粘?xiě)代碼的過(guò)程中,要避免產(chǎn)生歧義的這種情況

下面我們介紹一下順序不同如何形成函數(shù)重載

#include

using namespace std;

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()

{

int a = 1;

char b = 'abc';

f(a, b);

f(b, a);

return 0;

}

通過(guò)上面的代碼我們可以看出當(dāng)對(duì)應(yīng)的參數(shù)類型相同時(shí),我們可以通過(guò)改變形參的順序來(lái)使之成為函數(shù)重載

最后,我們來(lái)結(jié)合一下缺省函數(shù)來(lái)構(gòu)造出一個(gè)重構(gòu)函數(shù)

#include

using namespace std;

void f(int a = 4)

{

cout << "f(int a)" << endl;

}

void f()

{

cout << "f()" << endl;

}

int main()

{

f();

return 0;

}

![在這里插入圖片描述](https://img-blog.csdnimg.cn/direct/c09d

同學(xué)們請(qǐng)思考一下上面為什么會(huì)調(diào)用出錯(cuò),是因?yàn)闆](méi)有構(gòu)成函數(shù)重載嗎? 其實(shí)還是因?yàn)橹赶虿幻鞔_,在我們調(diào)用函數(shù)的時(shí)候,編譯器發(fā)現(xiàn)第一個(gè)函數(shù)和第二個(gè)函數(shù)都能夠調(diào)用,所以會(huì)發(fā)生調(diào)用錯(cuò)誤

最后提醒同學(xué)們注意的是:返回值不同不能構(gòu)成重載

2. c++如何支持函數(shù)重載之名字修飾

好的在我們介紹完函數(shù)重載后,大家有沒(méi)有過(guò)疑問(wèn),為什么c語(yǔ)言不支持函數(shù)重載,而c++支持函數(shù)重載,這是因?yàn)槲覀兊腸++在編譯與鏈接過(guò)程對(duì)函數(shù)名進(jìn)行了函數(shù)名的修飾,如果有不了解編譯與鏈接過(guò)程的同學(xué),可自行閱讀博主之前的編譯與鏈接的博客

在想要弄清楚函數(shù)重載的秘密,我們先來(lái)創(chuàng)建三個(gè)文件,以便我們后續(xù)的講解

在之前,我們就已經(jīng)分析了編譯與鏈接各個(gè)過(guò)程所完成的事情,而我們首先需要注意的是在鏈接過(guò)程之前的過(guò)程各個(gè)文件都是獨(dú)自完成的,這點(diǎn)大家先要搞清楚

我們?cè)趕tack.cpp定義一個(gè)StackInit函數(shù),并且在Test.cpp文件中進(jìn)行函數(shù)的調(diào)用,將代碼進(jìn)行反匯編可以得到如圖所示的匯編語(yǔ)言 我們可以很明顯的看出在call函數(shù)的地址之后,才會(huì)進(jìn)行后續(xù)的函數(shù)調(diào)用的指令 (因?yàn)椋篶all本質(zhì)是跳轉(zhuǎn),函數(shù)有一堆要執(zhí)行的指令,函數(shù)地址是第一句指令) 這有點(diǎn)類似數(shù)組,有了第一個(gè)就能訪問(wèn)剩下的元素

下面我們來(lái)思考一下,函數(shù)的地址是什么時(shí)候獲取的,又是如何獲取的呢? 我們需要注意的是,在鏈接過(guò)程之前,Test.cpp只有函數(shù)聲明,可以通過(guò)編譯,因?yàn)檎Z(yǔ)法檢查是匹配,但是沒(méi)有函數(shù)的地址 只有有了有函數(shù)的定義,才能生成函數(shù)一堆匯編指令,第一句指定的地址,才是函數(shù)的地址,Stack.cpp->Stack.o中才有函數(shù)的定義 聰明的同學(xué)已經(jīng)可以猜到了,因?yàn)樵阪溄舆^(guò)程中之前,我們各個(gè)文件都是單向的,只有在鏈接過(guò)程時(shí),我們才會(huì)進(jìn)行文件的合并,而由我們之前的知識(shí)可以知道,函數(shù)的地址會(huì)存放在stack.o中的符號(hào)表里,在我們鏈接時(shí),Test.o會(huì)拿著StackInit的函數(shù)名到Stack.o的符號(hào)表中去尋找

在類似的符號(hào)表中,存有每個(gè)函數(shù)名對(duì)應(yīng)的地址,在我們文件鏈接完成后,就能拿到函數(shù)的地址,從而進(jìn)行后續(xù)的函數(shù)調(diào)用的一系列操作

此時(shí)我們的小伙伴們,是不是就知道這個(gè)錯(cuò)誤時(shí)如何來(lái)的了?沒(méi)錯(cuò),就是因?yàn)槲覀內(nèi)鄙倭撕瘮?shù)的定義,事實(shí)也確實(shí)如此,我在vs中將函數(shù)的定義注釋掉,就會(huì)得到這樣的錯(cuò)誤信息

那我們現(xiàn)在給出總結(jié),以及為什么c++能夠支持我們的函數(shù)重載 鏈接時(shí): 1、直接用函數(shù)名字去查找,是否支持重載,不支持。C語(yǔ)言 2、直接用修飾后的函數(shù)名字去查找,就可以支持重載。C++

我們也可以很清晰的看出,括號(hào)里那段內(nèi)容不一樣,就是因?yàn)槲覀兊木幾g器將我們的函數(shù)名字進(jìn)行了修改,從而實(shí)現(xiàn)了我們的函數(shù)重載

3.引用的概念

引用不是新定義一個(gè)變量,而是給已存在變量取了一個(gè)別名,編譯器不會(huì)為引用變量開(kāi)辟內(nèi)存空間,它和它引用的變量共用同一塊內(nèi)存空間。

我們進(jìn)行調(diào)試可以得出,abcd公用一塊空間,我們對(duì)任意一個(gè)變量進(jìn)行操作,其他的變量都會(huì)隨之而改變 下面我們來(lái)簡(jiǎn)單介紹一下引用的好處和用處

typedef int SLTDataType;

typedef struct SListNode

{

int val;

struct SListNode* next;

}SLTNode;

void SLTPushBack(SLTNode** pphead, SLTDataType x);

void SLTPushBack(SLTNode** pphead, SLTDataType x)

{

assert(pphead);

SLTNode* newnode = (SLTNode*)malloc(sizeof(SLTNode));

newnode->val = x;

newnode->next = NULL;

if (*pphead == NULL)

{

*pphead = newnode;

return;

}

SLTNode* ptail = *pphead;

while (ptail->next)

{

ptail = ptail->next;

}

ptail->next = newnode;

}

我們?cè)跊](méi)有接觸引用之前,創(chuàng)建一個(gè)鏈表并進(jìn)行尾插,此時(shí)需要傳二級(jí)指針,這會(huì)導(dǎo)致不少同學(xué)犯錯(cuò),從而產(chǎn)生bug,而當(dāng)我們學(xué)習(xí)了引用,此時(shí)我們就可以將節(jié)點(diǎn)的別名傳過(guò)去,此時(shí)可以直接對(duì)節(jié)點(diǎn)進(jìn)行操作,不需要再傳二級(jí)指針,類似

void SLTPushBack(SLTNode*& pphead, SLTDataType x);

此時(shí)我也給大家解決一個(gè)問(wèn)題,就是有不少的考研書(shū)上會(huì)這樣寫(xiě)

typedef struct SListNode

{

int val;

struct SListNode* next;

}SLTNode,*PNode;

void SLTPushBack(PNode& pphead, SLTDataType x);

這其實(shí)是他們進(jìn)行了兩次重命名,第二次是將struct SListNode*重命名為PNode

4.引用的特性

1.引用在定義時(shí)必須初始化 2.一個(gè)變量可以有多個(gè)引用 3.引用一旦引用一個(gè)實(shí)體,再不能引用其他實(shí)體

5. 細(xì)談引用和指針權(quán)限的放大與縮小

接下來(lái)我們來(lái)談?wù)勔煤椭羔樀臋?quán)限

int main()

{

const int m = 0;

int& n = m;

}

請(qǐng)問(wèn)同學(xué)們,上面的代碼能夠運(yùn)行成功嗎? 哈哈,很明顯不行,因?yàn)樯婕暗搅藱?quán)限的放大,m是只讀的,而n變成別名以后可讀可寫(xiě) 此時(shí)我們有兩種改法

const int m = 0;

const int& n = m;

int m = 0;

const int& n = m;

這兩種方法都是可行的

那么,這樣可以嗎?哈哈

int main()

{

int a = 5;

const int* p1 = &a;

int* p2 = p1;

}

也是不行的,因?yàn)閏onst修飾*p1,p1不能改,而p2能修改

所以,我們可以得到的是,指針和引用有權(quán)限的放大,而普通的拷貝沒(méi)有權(quán)限的放大

好的謝謝大家閱讀本篇博客,期待我們的下一次相遇,覺(jué)得博主寫(xiě)的還可以的記得訂閱點(diǎn)贊收藏加關(guān)注哦!哈哈,下次再見(jiàn)啦!

柚子快報(bào)邀請(qǐng)碼778899分享:開(kāi)發(fā)語(yǔ)言 c++過(guò)渡知識(shí)2

http://yzkb.51969.com/

參考文章

評(píng)論可見(jiàn),查看隱藏內(nèi)容

本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點(diǎn)和立場(chǎng)。

轉(zhuǎn)載請(qǐng)注明,如有侵權(quán),聯(lián)系刪除。

本文鏈接:http://gantiao.com.cn/post/18826795.html

發(fā)布評(píng)論

您暫未設(shè)置收款碼

請(qǐng)?jiān)谥黝}配置——文章設(shè)置里上傳

掃描二維碼手機(jī)訪問(wèn)

文章目錄