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

C++詳細(xì)講解函數(shù)調(diào)用與Struct和CLass的區(qū)別

 更新時(shí)間:2022年05月10日 09:18:13   作者:丶布布  
主調(diào)函數(shù)使用被調(diào)函數(shù)的功能,稱為函數(shù)調(diào)用。在C語言/C++中,只有在函數(shù)調(diào)用時(shí),函數(shù)體中定義的功能才會被執(zhí)行,下面讓我們詳細(xì)來了解

一、結(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ù)方式對結(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");
	//這里通過添加監(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);                 //通過添加監(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ù)而變成2000
	cout << student.name << endl;  //這里發(fā)現(xiàn) 結(jié)構(gòu)Student成員變量name值并沒有因?yàn)檎{(diào)用函數(shù)變成“l(fā)isi”
}

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

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

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

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

2、引用調(diào)用

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

//引用傳遞
void func1(Student &temp1)
{
	temp1.number = 2000;
	strcpy_s(temp1.name, sizeof(temp1.name), "lisi");
	//這里通過添加監(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);                //通過添加監(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

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

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

3、指針調(diào)用

《用指向結(jié)構(gòu)體的指針*》作為函數(shù)形參的一種調(diào)用方式,通過對結(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");
	//這里通過添加監(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);               //通過添加監(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

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

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

小結(jié):

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

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

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

  • public:公有的意思、用這個(gè)修飾符修飾成員函數(shù)和成員變量,那么其可以被外界訪問,一般我們需要能被外界訪問的東西就定義為public,就好像該類的外部接口一樣。
  • private:私有的意思,用這個(gè)修飾符 修飾類中的成員函數(shù)和成員變量的時(shí)候,只有被內(nèi)部定義的成員函數(shù)才能使用。
struct Teacher
{
public: 
	int number;
	char name[100];
	void num()
	{
		number++;
		age = 30;   //內(nèi)部成員函數(shù)中可以訪問私有成員變量
	}
private:
	int age;
};
int main2()
{
	Teacher teacher;
	teacher.number = 1001;     //因?yàn)閚umber是公有成員變量,所以外界可以直接訪問
	//teacher.age;             //不可調(diào)用訪問
}

三、類簡介

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

  • 類這個(gè)概念只存在于C++中,C中是沒有類這個(gè)概念的。
  • 結(jié)構(gòu)用Struct定義,類用Class定義。

在C中,定義一個(gè)屬于該結(jié)構(gòu)的變量,叫結(jié)構(gòu)變量;而在C++中,定義一個(gè)屬于該類的變量,叫對象(也可以理解為變量)。結(jié)構(gòu)變量也好,對象也罷,他們都是一塊能夠存儲數(shù)據(jù)并且具有某種類型的內(nèi)存空間,說白了他們就是一塊內(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ù)中可以訪問私有成員變量
	}
private:
	int age;
};
int main2()
{
	Teacher teacher;
	teacher.number = 1001;   //這里仍然可以和定義結(jié)構(gòu)一樣正常調(diào)用成員變量并賦值
}

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

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

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

②C++類Class中,那些缺?。ㄎ炊x的數(shù)據(jù)類型)的成員變量和成員函數(shù),默認(rèn)訪問級別是private屬性,外界是訪問不了的。

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

2、從繼承角度來看:

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

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

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

四、類的組織

書寫規(guī)范:

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

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

下雨天,最愜意的事莫過于躺在床上靜靜聽雨,雨中入眠,連夢里也長出青苔。

到此這篇關(guān)于C++詳細(xì)講解函數(shù)調(diào)用與Struct和CLass的區(qū)別的文章就介紹到這了,更多相關(guān)C++函數(shù)調(diào)用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • VisualStudio2019配置OpenCV4.5.0的方法示例

    VisualStudio2019配置OpenCV4.5.0的方法示例

    這篇文章主要介紹了VisualStudio2019配置OpenCV4.5.0的方法示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • VisualStudio?禁用移動文件到文件夾自動修改命名空間功能

    VisualStudio?禁用移動文件到文件夾自動修改命名空間功能

    這篇文章主要介紹了VisualStudio?禁用移動文件到文件夾自動修改命名空間功能,文章底部給大家介紹了解決安裝VS2022時(shí),出現(xiàn)未能安裝包“Microsoft.VisualCpp.Redist.14,version=14.32.31332,chip”=x86,的問題及解決方法,需要的朋友可以參考下
    2022-09-09
  • C++ STL之slist單向鏈表容器使用方式

    C++ STL之slist單向鏈表容器使用方式

    這篇文章主要介紹了C++ STL之slist單向鏈表容器使用方式,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-04-04
  • C++中關(guān)于[]靜態(tài)數(shù)組和new分配的動態(tài)數(shù)組的區(qū)別分析

    C++中關(guān)于[]靜態(tài)數(shù)組和new分配的動態(tài)數(shù)組的區(qū)別分析

    這篇文章主要介紹了C++中關(guān)于[]靜態(tài)數(shù)組和new分配的動態(tài)數(shù)組的區(qū)別分析,很重要的概念,需要的朋友可以參考下
    2014-08-08
  • 利用c++編寫簡易版2048小游戲

    利用c++編寫簡易版2048小游戲

    這篇文章主要介紹了如何讓利用c++編寫簡易版的2048小游戲,感興趣的小伙伴請參考下面文章的具體內(nèi)容
    2021-09-09
  • C++實(shí)現(xiàn)圖片jpg格式變成16位565bmp格式

    C++實(shí)現(xiàn)圖片jpg格式變成16位565bmp格式

    這篇文章主要為大家詳細(xì)介紹了C++如何實(shí)現(xiàn)圖片jpg格式變成16位565bmp格式,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下
    2025-03-03
  • C++如何有效地利用命名空間

    C++如何有效地利用命名空間

    談到C++編程中的模塊化和組織性時(shí),命名空間(Namespace)是一個(gè)重要的概念,所以本文主要來和大家聊聊C++命名空間的概念、用法以及如何有效地利用它來管理代碼,有需要的可以參考下
    2023-09-09
  • C語言解字符串逆序和單向鏈表逆序問題的代碼示例

    C語言解字符串逆序和單向鏈表逆序問題的代碼示例

    這篇文章主要介紹了C語言解字符串逆序和單向鏈表逆序問題的代碼示例,求逆序也是考研和面試中的基礎(chǔ)算法題類型,需要的朋友可以參考下
    2016-06-06
  • opencv幀差法找出相差大的圖像

    opencv幀差法找出相差大的圖像

    這篇文章主要為大家詳細(xì)介紹了opencv幀差法找出相差大的圖像,包含訪問mat的像素值,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-03-03
  • C++ Boost Uuid超詳細(xì)講解

    C++ Boost Uuid超詳細(xì)講解

    Boost是為C++語言標(biāo)準(zhǔn)庫提供擴(kuò)展的一些C++程序庫的總稱。Boost庫是一個(gè)可移植、提供源代碼的C++庫,作為標(biāo)準(zhǔn)庫的后備,是C++標(biāo)準(zhǔn)化進(jìn)程的開發(fā)引擎之一,是為C++語言標(biāo)準(zhǔn)庫提供擴(kuò)展的一些C++程序庫的總稱
    2022-12-12

最新評論

梓潼县| 隆化县| 祁门县| 喜德县| 石台县| 江陵县| 抚州市| 南川市| 巨鹿县| 八宿县| 云和县| 得荣县| 黎平县| 松潘县| 武邑县| 达日县| 哈尔滨市| 报价| 旬阳县| 澜沧| 象山县| 鸡西市| 娄烦县| 遵化市| 双鸭山市| 五大连池市| 白山市| 克东县| 阳山县| 界首市| 伊春市| 丽水市| 抚远县| 崇明县| 绍兴市| 昆明市| 昌平区| 河北区| 永康市| 星子县| 云和县|