徐州萬網(wǎng)網(wǎng)站建設(shè)seo優(yōu)化上首頁
堅持看完,結(jié)尾有思維導(dǎo)圖總結(jié)
這里寫目錄標(biāo)題
- C語言和 C++ 的區(qū)別
- 類的定義
- 類的初認(rèn)識
- 類的內(nèi)容
- 訪問限定符
- 類的作用域
- 類的實例化
- 類中的 this 指針
- 總結(jié)
C語言和 C++ 的區(qū)別
C++ 的祖師爺除了在 C語言的基礎(chǔ)上化簡了一些復(fù)雜操作
更為重要的是,兩個語言實現(xiàn)的過程是不一樣的
C 語言是一種面向過程的語言,而 C++ 是一種面向?qū)ο蟮恼Z言
如果是洗衣服
C 語言會這樣洗
那盆子,放水,放衣服,加洗衣粉,手搓,晾干
而 C++ 會先分析有哪些對象
會有 人 衣服 洗衣機 洗衣粉
通過這些對象的交互完成洗衣服
人只要做把衣服放進(jìn)洗衣機,加洗衣粉,打開洗衣機就可以
不需要關(guān)注衣服是怎么洗的
類的定義
類的初認(rèn)識
上面我們?nèi)绻怯?C 語言來寫,就要定義一個盆子,然后放水是一個函數(shù)
放衣服是一個函數(shù),加洗衣粉是一個函數(shù),手搓衣服是一個函數(shù),晾干是一個函數(shù)
然后一步步地走
但是 C++ 不同
他會把人 衣服 洗衣粉 洗衣機分別定義成一個個的類
人有哪些特性,功能,歸到人這個類里面
衣服有哪些特性功能,歸到衣服這個類中
洗衣機有哪些特性功能,歸到洗衣機這個類中
我們很自然地聯(lián)想到,一個自定義的類型,在 C語言中我們常使用結(jié)構(gòu)體定義
struct 但是 在 C 語言里面,結(jié)構(gòu)體內(nèi)部并不支持函數(shù)
然而在 C++ 中,我們可以在結(jié)構(gòu)體里頭寫函數(shù)了 ,這樣于 c語言結(jié)構(gòu)體類似但是不同的東西 我們把他叫做類
類的定義是這樣的
class Name
{
//成員函數(shù)和成員變量
};// 注意分號
類的內(nèi)容
類中的內(nèi)容可以分成兩類,一類是 成員變量 , 一類是成員函數(shù)
如果我們認(rèn)識一個人,我們能知道這個人是誰,叫什么名字,是什么性別
class Person
{
//成員函數(shù)
public:void personinfo(){cout << _name << ' ' << _age << ' ' << _sex << endl;}
// 成員變量
private:char* _name;int _age;char* _sex;
};
這里的實現(xiàn)是聲明和定義放在一起的
有時候,類中聲明和函數(shù)放在一起的情況,編譯器可能會把成員函數(shù)看做是內(nèi)聯(lián)函數(shù)
如果我們想要把聲明和實現(xiàn)分離
在實現(xiàn)的位置,一個是不要忘記頭文件的應(yīng)用
在引用完頭文件后,要說明實現(xiàn)的函數(shù)屬于哪一個類,這里是類的作用域的問題
聲明則放在類里面
訪問限定符
有一件奇怪的事情
為什么成員變量前面要加上 private 而 成員函數(shù)前面要加上 public
這里就設(shè)計到訪問限定符的問題
我們都用過洗衣機,也大概都知道怎么用洗衣機
就那幾個按鈕的事情對吧
我們不會為了使用洗衣機去研究洗衣機的結(jié)構(gòu)
類也是這樣,除了設(shè)計者
使用的人只要會用成員函數(shù)就可以了,并不會去關(guān)注成員變量有哪些
public 變式公共的 ,能夠為外界調(diào)用
private 表示私人,就是不能被類之外的操作訪問,但是類內(nèi)的函數(shù)(成員函數(shù))是可以訪問的
那我們就能夠調(diào)用 public 的函數(shù)來間接按照特定的方式訪問 private 的成員
還有 一個訪問限定符 叫 protected 因為是 簡略說明 ,所以暫時不介紹
其中需要注意的是
class的默認(rèn)訪問權(quán)限為private,struct為public(因為struct要兼容C)
訪問權(quán)限作用域從該訪問限定符出現(xiàn)的位置開始直到下一個訪問限定符出現(xiàn)時為止, 如果后面沒有訪問限定符,作用域就到 } 即類結(jié)束。
而這種通過訪問權(quán)限,隱藏類的成員變量結(jié)構(gòu),顯示類的訪問方式的做法,就是封裝
就好像是洗衣機內(nèi)部被洗衣機外殼包起來,我們看不到內(nèi)部結(jié)構(gòu)的方式,就是封裝
而封裝是面向?qū)ο?的三大特性之一
類的作用域
之前在初識C++ 中,我們說為了防止多個程序員使用同名變量,同名函數(shù)
我們可以用不同的作用域,來圈定哪些變量屬于程序員 A ,哪些變量屬于程序員 B
而當(dāng)我們定義一個類的時候,會自動生成一個類的作用域
不同的類是可以使用同名函數(shù)和變量的,使用類的作用域能夠很好地應(yīng)對這種情況
因為成員變量已經(jīng)在類里面了不用再表明屬于哪一個類
而當(dāng)函數(shù)聲明和實現(xiàn)分離時,在實現(xiàn)函數(shù)的時候,必須指明屬于哪一個類,防止實現(xiàn)的混淆
類的實例化
前面我們解決的是類的聲明的問題
類的聲明,就好像把動物分成一個個種類,比如像熊貓,這是一類動物
但是其中的每一只熊貓都有自己的特征,自己的名字等
這種就叫做實例化
在計算機中,我們說類有 成員函數(shù),成員變量,都是類的聲明
而在使用中調(diào)用的類,才是類的實例化
我們可以簡單理解為為類開空間就是類的實例化
既然為類開空間了,那就說明有空間大小
空間大小是如何計算呢?
尤其是一個類中有成員函數(shù),整個類大大小計算更加奇怪了
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
using namespace std;class Date
{
public:void DateInit(Date& date, int year = 1, int month = 1, int day = 1);
private:int _year;int _month;int _day;
};void Date::DateInit(Date& date,int year,int month,int day)
{date._year = year;date._day = day;date._month = month;
}int main()
{Date d1;d1.DateInit(d1,2023,2,14);cout << sizeof(d1) << endl;return 0;
}
我定義了一個日期類,其中內(nèi)部成員有年月日
通過計算大小,發(fā)現(xiàn)
計算大小是 12 ,說明 ---- 內(nèi)部只給內(nèi)部成員開辟了空間,但是沒有給函數(shù)開辟空間
那函數(shù)的空間開辟到哪里去了呢?
實際上,類的空間開辟,是這樣的
事實上,每一個成員雖然不同,但是調(diào)用的成員函數(shù)傳遞的參數(shù)都是一樣的
也就是說,對于類的成員函數(shù)來說
每個類只要把成員函數(shù)需要的參數(shù)傳給我就可以了
成員函數(shù)是不管你是哪一個成員
我們在觀察一下對應(yīng)的匯編代碼
可以看到調(diào)用的是同一個函數(shù)
既然編譯器都幫你對應(yīng)的函數(shù)調(diào)用轉(zhuǎn)換了,和調(diào)用一個普通函數(shù)差不多
又何必開辟空間儲存對應(yīng)的函數(shù)指針甚至是整個函數(shù)棧幀呢,答案是沒有必要浪費這個空間
但是要注意的是,如果實例化一個空類(一個沒有內(nèi)容的類)
他的空間大小是 1 ,用來占位
類中的 this 指針
在類的成員函數(shù)中,我們可以這樣寫初始化函數(shù)
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>using namespace std;class Date
{
public:void Init(int year,int month,int day){_year = year;_month = month;_day = day;}
private:int _year;int _month;int _day;
};int main()
{Date d1;d1.Init(2023,2,16);return 0;
}
在調(diào)試中我們能夠看到 d1 被初始化為 2023 2 16
但是傳參中,我可是沒有傳遞任何與 d1 相關(guān)的參數(shù)
只是之前的 d1.Init 指定了一下而已
成員函數(shù)是怎么樣找到 d1 然后將 d1 初始化的呢?
實際上,編譯器會自動幫我們傳遞一個 this 指針 的參數(shù)交給成員函數(shù)
這個 this 指針始終指向 調(diào)用這個成員函數(shù)的對象
比如我們 d1.Init 調(diào)用 Init 成員函數(shù)
編譯器會把 this 指針傳參
然后對應(yīng)的成員 變成 this->成員 的解引用
但是我們不能直接把 this 指針當(dāng)成一個參數(shù)寫在函數(shù)上面
如果這樣寫,編譯器會傳遞自己在函數(shù)自動傳參的 this 指針
但是 用戶寫的 this 這個形參的坑就沒有人填了,導(dǎo)致形參數(shù)量過多,出現(xiàn)問題
總結(jié)
希望大家看完,能夠有所
如果有錯誤,請指出我一定虛心改正
動動小手點贊
鼓勵我輸出更加優(yōu)質(zhì)的內(nèi)容