溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

C++函數(shù)調(diào)用與Struct和CLass的區(qū)別是什么

發(fā)布時(shí)間:2022-05-10 14:13:21 來(lái)源:億速云 閱讀:187 作者:zzz 欄目:開(kāi)發(fā)技術(shù)

本篇內(nèi)容介紹了“C++函數(shù)調(diào)用與Struct和CLass的區(qū)別是什么”的有關(guān)知識(shí),在實(shí)際案例的操作過(guò)程中,不少人都會(huì)遇到這樣的困境,接下來(lái)就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

    一、結(jié)構(gòu)回顧

    結(jié)構(gòu):自定義的數(shù)據(jù)類型,不管C++/C結(jié)構(gòu)都用Struct定義,與C中的結(jié)構(gòu)相比,C++中的結(jié)構(gòu)不僅僅有成員變量,還可以在其中定義成員函數(shù)(或方法)。

    代碼:

    struct Student
    {
    	int number;      //成員變量
    	char name[100];  //成員變量
    	void num()       //成員函數(shù)(方法)
    	{
    		number++;
    	}
    };

    三種調(diào)用函數(shù)方式對(duì)結(jié)構(gòu)成員變量值的影響 :

    1、傳值調(diào)用

    《結(jié)構(gòu)變量》作為函數(shù)形參的一種調(diào)用方式

    //值傳遞
    void func(Student temp)//《結(jié)構(gòu)變量》作為函數(shù)形參的一種調(diào)用方式(值傳遞)
    {
    	temp.number = 2000;
    	strcpy_s(temp.name, sizeof(temp.name), "lisi");
    	//這里通過(guò)添加監(jiān)視,看到形參結(jié)構(gòu)變量temp的內(nèi)存地址已經(jīng)變?yōu)榱?x00d7fbe4
    	return;
    }
    int main()
    {
    	Student student;
    	student.number = 1001;
    	strcpy_s(student.name, sizeof(student.name), "zhangsan");
    	func(student);                 //通過(guò)添加監(jiān)視,看到實(shí)參結(jié)構(gòu)變量student的內(nèi)存地址是0x00d7fd20
    	cout << student.number << endl;//這里發(fā)現(xiàn) 結(jié)構(gòu)Student成員變量number值并沒(méi)有因?yàn)檎{(diào)用函數(shù)而變成2000
    	cout << student.name << endl;  //這里發(fā)現(xiàn) 結(jié)構(gòu)Student成員變量name值并沒(méi)有因?yàn)檎{(diào)用函數(shù)變成“l(fā)isi”
    }

    可以看到,調(diào)用函數(shù)func之前,實(shí)參結(jié)構(gòu)變量student的內(nèi)存地址是0x00d7fd20

    C++函數(shù)調(diào)用與Struct和CLass的區(qū)別是什么

    調(diào)用函數(shù)func,進(jìn)入函數(shù)內(nèi)部,發(fā)現(xiàn)形參結(jié)構(gòu)變量temp的內(nèi)存地址已經(jīng)變?yōu)榱?x00d7fbe4

    C++函數(shù)調(diào)用與Struct和CLass的區(qū)別是什么

    交互失敗的原因:傳值調(diào)用,形參temp僅僅是對(duì)實(shí)參student進(jìn)行了值拷貝,兩者的內(nèi)存地址是不同的,所以函數(shù)里對(duì)形參的改變不會(huì)影響到函數(shù)外的變量的值。

    PS:上面這種傳值調(diào)用方法(值傳遞)效率比較低,因?yàn)閷?shí)參傳遞給形參時(shí),發(fā)生了內(nèi)存內(nèi)容的拷貝(實(shí)參內(nèi)容拷貝給了形參),尤其是當(dāng)結(jié)構(gòu)或類對(duì)象做形參,外界實(shí)參需要拷貝較多的值給函數(shù)形參的的時(shí)候會(huì)體現(xiàn)的更明顯。

    2、引用調(diào)用

    《引用&》作為函數(shù)形參的一種調(diào)用方式,就是把結(jié)構(gòu)變量的引用傳入函數(shù)中,相當(dāng)于將變量的地址傳進(jìn)了函數(shù)內(nèi)部,對(duì)形參的內(nèi)存地址(內(nèi)容)進(jìn)行更改就相當(dāng)于對(duì)函數(shù)外部實(shí)參的內(nèi)存地址(內(nèi)容)進(jìn)行修改了。

    //引用傳遞
    void func1(Student &temp1)
    {
    	temp1.number = 2000;
    	strcpy_s(temp1.name, sizeof(temp1.name), "lisi");
    	//這里通過(guò)添加監(jiān)視,看到形參結(jié)構(gòu)變量temp1的內(nèi)存地址仍然是0x00d7fd20
    	return;
    }
    int main()
    {
    	Student student;
    	student.number = 1001;
    	strcpy_s(student.name, sizeof(student.name), "zhangsan");
    	func1(student);                //通過(guò)添加監(jiān)視,看到實(shí)參結(jié)構(gòu)變量student的內(nèi)存地址是0x00d7fd20
    	cout << student.number << endl;//這里發(fā)現(xiàn) 結(jié)構(gòu)Student成員變量number值因?yàn)檎{(diào)用函數(shù)func1而變成2000
    	cout << student.name << endl;  //這里發(fā)現(xiàn) 結(jié)構(gòu)Student成員變量name值因?yàn)檎{(diào)用函數(shù)func1變成“l(fā)isi”
    }

    可以看到,調(diào)用函數(shù)func1之前,實(shí)參結(jié)構(gòu)變量student的內(nèi)存地址是0x00d7fd20

    C++函數(shù)調(diào)用與Struct和CLass的區(qū)別是什么

    調(diào)用函數(shù)func1,進(jìn)入函數(shù)內(nèi)部,發(fā)現(xiàn)形參結(jié)構(gòu)變量temp1的內(nèi)存地址仍然是0x00d7fd20

    C++函數(shù)調(diào)用與Struct和CLass的區(qū)別是什么

    交互成功的原因:形參temp1直接引用實(shí)參student的地址,對(duì)這個(gè)地址上的變量進(jìn)行操作,相當(dāng)于直接操作實(shí)參student上的變量,省略了數(shù)值拷貝的過(guò)程,效率很高。

    3、指針調(diào)用

    《用指向結(jié)構(gòu)體的指針*》作為函數(shù)形參的一種調(diào)用方式,通過(guò)對(duì)結(jié)構(gòu)變量取地址作為實(shí)參賦給函數(shù)的形參指針。

    //指針傳遞
    void func2(Student *temp2)//《用指向結(jié)構(gòu)體的指針》作為函數(shù)參數(shù)
    {
    	temp2->number = 2000;
    	strcpy_s(temp2->name, sizeof(temp2->name), "lisi");
    	//這里通過(guò)添加監(jiān)視,看到形參結(jié)構(gòu)變量temp1的內(nèi)存地址仍然是0x003af858 
    	return;
    }
    int main()
    {
    	Student student;
    	student.number = 1001;
    	strcpy_s(student.name, sizeof(student.name), "zhangsan");
    	func2(&student);               //通過(guò)添加監(jiān)視,看到實(shí)參結(jié)構(gòu)變量student的內(nèi)存地址是0x003af858 
    	cout << student.number << endl;//這里發(fā)現(xiàn) 結(jié)構(gòu)Student成員變量number值因?yàn)檎{(diào)用函數(shù)func1而變成2000
    	cout << student.name << endl;  //這里發(fā)現(xiàn) 結(jié)構(gòu)Student成員變量name值因?yàn)檎{(diào)用函數(shù)func1變成“l(fā)isi”
    }

    可以看到,調(diào)用函數(shù)func2之前,實(shí)參結(jié)構(gòu)變量student的內(nèi)存地址是0x003af858

    C++函數(shù)調(diào)用與Struct和CLass的區(qū)別是什么

    調(diào)用函數(shù)func2,進(jìn)入函數(shù)內(nèi)部,發(fā)現(xiàn)形參結(jié)構(gòu)變量temp2的內(nèi)存地址仍然是0x003af858

    C++函數(shù)調(diào)用與Struct和CLass的區(qū)別是什么

    交互成功的原因:和上面引用引用傳遞類似,同樣是將地址傳進(jìn)去了,直接對(duì)地址進(jìn)行操作,在函數(shù)func2中直接修改了地址中的內(nèi)容,函數(shù)外部對(duì)象的值同樣被修改了,效率也很高。

    小結(jié):

    引用調(diào)用和指針調(diào)用的效率明顯高于傳值調(diào)用,在C++中,更習(xí)慣用引用類型的形參來(lái)取代指針類型的形參。

    二、public和private權(quán)限修飾符

    權(quán)限修飾符:public、private、protected,本文只談前兩個(gè)公有public和私有private。保護(hù)protected后面討論。

    • public:公有的意思、用這個(gè)修飾符修飾成員函數(shù)和成員變量,那么其可以被外界訪問(wèn),一般我們需要能被外界訪問(wèn)的東西就定義為public,就好像該類的外部接口一樣。

    • private:私有的意思,用這個(gè)修飾符 修飾類中的成員函數(shù)和成員變量的時(shí)候,只有被內(nèi)部定義的成員函數(shù)才能使用。

    struct Teacher
    {
    public: 
    	int number;
    	char name[100];
    	void num()
    	{
    		number++;
    		age = 30;   //內(nèi)部成員函數(shù)中可以訪問(wèn)私有成員變量
    	}
    private:
    	int age;
    };
    int main2()
    {
    	Teacher teacher;
    	teacher.number = 1001;     //因?yàn)閚umber是公有成員變量,所以外界可以直接訪問(wèn)
    	//teacher.age;             //不可調(diào)用訪問(wèn)
    }

    三、類簡(jiǎn)介

    類:與結(jié)構(gòu)一樣也是用戶自定義的數(shù)據(jù)類型,類和結(jié)構(gòu)的主要區(qū)別如下:

    • 類這個(gè)概念只存在于C++中,C中是沒(méi)有類這個(gè)概念的。

    • 結(jié)構(gòu)用Struct定義,類用Class定義。

    在C中,定義一個(gè)屬于該結(jié)構(gòu)的變量,叫結(jié)構(gòu)變量;而在C++中,定義一個(gè)屬于該類的變量,叫對(duì)象(也可以理解為變量)。結(jié)構(gòu)變量也好,對(duì)象也罷,他們都是一塊能夠存儲(chǔ)數(shù)據(jù)并且具有某種類型的內(nèi)存空間,說(shuō)白了他們就是一塊內(nèi)存,這個(gè)內(nèi)存中存著很多東西。

    我們將上面的<<二、public和private權(quán)限修飾符>>中的結(jié)構(gòu)Teacher定義成類看一下:

    class Teacher
    {
    public: //結(jié)構(gòu)成員缺省都有public屬性,所以可以省略public
    	int number;
    	char name[100];
    	void num()
    	{
    		number++;
    		age = 30;   //內(nèi)部成員函數(shù)中可以訪問(wèn)私有成員變量
    	}
    private:
    	int age;
    };
    int main2()
    {
    	Teacher teacher;
    	teacher.number = 1001;   //這里仍然可以和定義結(jié)構(gòu)一樣正常調(diào)用成員變量并賦值
    }

    從上面的例子中,我們可以看出結(jié)構(gòu)和類的作用應(yīng)該是極其相似的,那么兩者有什么區(qū)別呢?

    1、從訪問(wèn)權(quán)限角度來(lái)看: 結(jié)構(gòu)體和類具有不同的默認(rèn)訪問(wèn)控制屬性

    ①C++結(jié)構(gòu)體Struct中,那些缺?。ㄎ炊x的數(shù)據(jù)類型)的成員變量和成員函數(shù),默認(rèn)訪問(wèn)級(jí)別是public屬性,在外部都可以直接調(diào)用。

    C++函數(shù)調(diào)用與Struct和CLass的區(qū)別是什么

    ②C++類Class中,那些缺省(未定義的數(shù)據(jù)類型)的成員變量和成員函數(shù),默認(rèn)訪問(wèn)級(jí)別是private屬性,外界是訪問(wèn)不了的。

    C++函數(shù)調(diào)用與Struct和CLass的區(qū)別是什么

    為了彌補(bǔ)這個(gè)問(wèn)題,我們不管是定義類還是定義結(jié)構(gòu),全部明確定義上其訪問(wèn)屬性(public、private),那么區(qū)別也就不是區(qū)別了。

    2、從繼承角度來(lái)看:

    ①C++結(jié)構(gòu)體中,默認(rèn)是public繼承(子類可以訪問(wèn)父類中成員);

    C++函數(shù)調(diào)用與Struct和CLass的區(qū)別是什么

    ②C++類中,默認(rèn)是private繼承(子類不可以訪問(wèn)父類中成員)。

    C++函數(shù)調(diào)用與Struct和CLass的區(qū)別是什么

    為了彌補(bǔ)這個(gè)問(wèn)題,我們不管是繼承類還是繼承結(jié)構(gòu),全部明確繼承屬性(public、private),那么區(qū)別也就不是區(qū)別了。

    四、類的組織

    書寫規(guī)范:

    類的定義代碼會(huì)放在一個(gè).h頭文件中,頭文件名可以跟類名相同,student.h

    類的實(shí)現(xiàn)代碼會(huì)放在一個(gè).cpp源文件中,student.cpp

    C++函數(shù)調(diào)用與Struct和CLass的區(qū)別是什么

    “C++函數(shù)調(diào)用與Struct和CLass的區(qū)別是什么”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!

    向AI問(wèn)一下細(xì)節(jié)

    免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

    AI