中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C++函數調用與Struct和CLass的區別是什么

發布時間:2022-05-10 14:13:21 來源:億速云 閱讀:184 作者:zzz 欄目:開發技術

本篇內容介紹了“C++函數調用與Struct和CLass的區別是什么”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

    一、結構回顧

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

    代碼:

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

    三種調用函數方式對結構成員變量值的影響 :

    1、傳值調用

    《結構變量》作為函數形參的一種調用方式

    //值傳遞
    void func(Student temp)//《結構變量》作為函數形參的一種調用方式(值傳遞)
    {
    	temp.number = 2000;
    	strcpy_s(temp.name, sizeof(temp.name), "lisi");
    	//這里通過添加監視,看到形參結構變量temp的內存地址已經變為了0x00d7fbe4
    	return;
    }
    int main()
    {
    	Student student;
    	student.number = 1001;
    	strcpy_s(student.name, sizeof(student.name), "zhangsan");
    	func(student);                 //通過添加監視,看到實參結構變量student的內存地址是0x00d7fd20
    	cout << student.number << endl;//這里發現 結構Student成員變量number值并沒有因為調用函數而變成2000
    	cout << student.name << endl;  //這里發現 結構Student成員變量name值并沒有因為調用函數變成“lisi”
    }

    可以看到,調用函數func之前,實參結構變量student的內存地址是0x00d7fd20

    C++函數調用與Struct和CLass的區別是什么

    調用函數func,進入函數內部,發現形參結構變量temp的內存地址已經變為了0x00d7fbe4

    C++函數調用與Struct和CLass的區別是什么

    交互失敗的原因:傳值調用,形參temp僅僅是對實參student進行了值拷貝,兩者的內存地址是不同的,所以函數里對形參的改變不會影響到函數外的變量的值。

    PS:上面這種傳值調用方法(值傳遞)效率比較低,因為實參傳遞給形參時,發生了內存內容的拷貝(實參內容拷貝給了形參),尤其是當結構或類對象做形參,外界實參需要拷貝較多的值給函數形參的的時候會體現的更明顯。

    2、引用調用

    《引用&》作為函數形參的一種調用方式,就是把結構變量的引用傳入函數中,相當于將變量的地址傳進了函數內部,對形參的內存地址(內容)進行更改就相當于對函數外部實參的內存地址(內容)進行修改了。

    //引用傳遞
    void func1(Student &temp1)
    {
    	temp1.number = 2000;
    	strcpy_s(temp1.name, sizeof(temp1.name), "lisi");
    	//這里通過添加監視,看到形參結構變量temp1的內存地址仍然是0x00d7fd20
    	return;
    }
    int main()
    {
    	Student student;
    	student.number = 1001;
    	strcpy_s(student.name, sizeof(student.name), "zhangsan");
    	func1(student);                //通過添加監視,看到實參結構變量student的內存地址是0x00d7fd20
    	cout << student.number << endl;//這里發現 結構Student成員變量number值因為調用函數func1而變成2000
    	cout << student.name << endl;  //這里發現 結構Student成員變量name值因為調用函數func1變成“lisi”
    }

    可以看到,調用函數func1之前,實參結構變量student的內存地址是0x00d7fd20

    C++函數調用與Struct和CLass的區別是什么

    調用函數func1,進入函數內部,發現形參結構變量temp1的內存地址仍然是0x00d7fd20

    C++函數調用與Struct和CLass的區別是什么

    交互成功的原因:形參temp1直接引用實參student的地址,對這個地址上的變量進行操作,相當于直接操作實參student上的變量,省略了數值拷貝的過程,效率很高。

    3、指針調用

    《用指向結構體的指針*》作為函數形參的一種調用方式,通過對結構變量取地址作為實參賦給函數的形參指針。

    //指針傳遞
    void func2(Student *temp2)//《用指向結構體的指針》作為函數參數
    {
    	temp2->number = 2000;
    	strcpy_s(temp2->name, sizeof(temp2->name), "lisi");
    	//這里通過添加監視,看到形參結構變量temp1的內存地址仍然是0x003af858 
    	return;
    }
    int main()
    {
    	Student student;
    	student.number = 1001;
    	strcpy_s(student.name, sizeof(student.name), "zhangsan");
    	func2(&student);               //通過添加監視,看到實參結構變量student的內存地址是0x003af858 
    	cout << student.number << endl;//這里發現 結構Student成員變量number值因為調用函數func1而變成2000
    	cout << student.name << endl;  //這里發現 結構Student成員變量name值因為調用函數func1變成“lisi”
    }

    可以看到,調用函數func2之前,實參結構變量student的內存地址是0x003af858

    C++函數調用與Struct和CLass的區別是什么

    調用函數func2,進入函數內部,發現形參結構變量temp2的內存地址仍然是0x003af858

    C++函數調用與Struct和CLass的區別是什么

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

    小結:

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

    二、public和private權限修飾符

    權限修飾符:public、private、protected,本文只談前兩個公有public和私有private。保護protected后面討論。

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

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

    struct Teacher
    {
    public: 
    	int number;
    	char name[100];
    	void num()
    	{
    		number++;
    		age = 30;   //內部成員函數中可以訪問私有成員變量
    	}
    private:
    	int age;
    };
    int main2()
    {
    	Teacher teacher;
    	teacher.number = 1001;     //因為number是公有成員變量,所以外界可以直接訪問
    	//teacher.age;             //不可調用訪問
    }

    三、類簡介

    類:與結構一樣也是用戶自定義的數據類型,類和結構的主要區別如下:

    • 類這個概念只存在于C++中,C中是沒有類這個概念的。

    • 結構用Struct定義,類用Class定義。

    在C中,定義一個屬于該結構的變量,叫結構變量;而在C++中,定義一個屬于該類的變量,叫對象(也可以理解為變量)。結構變量也好,對象也罷,他們都是一塊能夠存儲數據并且具有某種類型的內存空間,說白了他們就是一塊內存,這個內存中存著很多東西。

    我們將上面的<<二、public和private權限修飾符>>中的結構Teacher定義成類看一下:

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

    從上面的例子中,我們可以看出結構和類的作用應該是極其相似的,那么兩者有什么區別呢?

    1、從訪問權限角度來看: 結構體和類具有不同的默認訪問控制屬性

    ①C++結構體Struct中,那些缺省(未定義的數據類型)的成員變量和成員函數,默認訪問級別是public屬性,在外部都可以直接調用。

    C++函數調用與Struct和CLass的區別是什么

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

    C++函數調用與Struct和CLass的區別是什么

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

    2、從繼承角度來看:

    ①C++結構體中,默認是public繼承(子類可以訪問父類中成員);

    C++函數調用與Struct和CLass的區別是什么

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

    C++函數調用與Struct和CLass的區別是什么

    為了彌補這個問題,我們不管是繼承類還是繼承結構,全部明確繼承屬性(public、private),那么區別也就不是區別了。

    四、類的組織

    書寫規范:

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

    類的實現代碼會放在一個.cpp源文件中,student.cpp

    C++函數調用與Struct和CLass的區別是什么

    “C++函數調用與Struct和CLass的區別是什么”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

    向AI問一下細節

    免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    AI

    双鸭山市| 万全县| 通州市| 禄丰县| 阜康市| 常州市| 舟山市| 新巴尔虎右旗| 古蔺县| 浦城县| 仙居县| 泽州县| 和硕县| 莱阳市| 深水埗区| 德阳市| 河源市| 中超| 新乡市| 西安市| 佛教| 舞钢市| 曲麻莱县| 万盛区| 探索| 策勒县| 新乐市| 石台县| 松滋市| 沂源县| 怀远县| 马鞍山市| 南川市| 株洲县| 广饶县| 涡阳县| 横峰县| 佳木斯市| 南开区| 邵阳县| 枞阳县|