???博客主頁:小王又困了
??系列專欄:C++
??人之為學(xué),不日近則日退?
??感謝大家點贊??收藏?評論??
目錄
一、類的引入
二、類的定義
三、類的訪問限定符
四、類的作用域
五、類的實例化
六、this指針
??6.1this指針的引出
??6.2 this指針的特性
???前言:
??面向過程
? ? ?C語言是面向過程的,關(guān)注的是過程,分析出求解問題的步驟,通過函數(shù)調(diào)用逐步解決問題。用洗衣服舉例。
??面向?qū)ο?/span>
? ? ?C++是基于面向?qū)ο蟮?,關(guān)注的是對象,將一件事情拆分成不同的對象,靠對象之間的交互完 成。對于洗衣服這件事,C++設(shè)置了四個對象:人、衣服、洗衣粉、洗衣機。整個洗衣服的過程就變成了:人將衣服放進洗衣機、倒入洗衣粉、啟動洗衣機,洗衣機就會完成洗衣過程并甩干。整個洗衣服的過程,是人、衣服、洗衣粉、洗衣機四個對象之間交互完成的,人不需要關(guān)心洗衣機具體是如何洗衣服的。
一、類的引入
? ? ?C語言結(jié)構(gòu)體中只能定義變量,在C++中,結(jié)構(gòu)體內(nèi)不僅可以定義變量,也可以定義函數(shù)。比如: 之前在數(shù)據(jù)結(jié)構(gòu)初階中,用C語言方式實現(xiàn)的棧,結(jié)構(gòu)體中只能定義變量;現(xiàn)在以C++方式實現(xiàn), 會發(fā)現(xiàn)struct中也可以定義函數(shù)。
??C語言版
struct Stack
{
int* arr;
int capacity;
int size;
};
struct Stack s;//聲明一個結(jié)構(gòu)體變量
void StackInit(struct Stack* ps);
void StackPush(struct Stack* ps,int x);
? ? ?在C語言中,數(shù)據(jù)和方法分離,傳遞參數(shù)才能訪問數(shù)據(jù),沒有對類型重定義只能寫成struct Stack。函數(shù)名必須區(qū)分,要寫成StackInit,在一個程序中如果有別的結(jié)構(gòu),例如:鏈表,就無法區(qū)分。
??C++版
struct Stack
{
//函數(shù)
void Init()
{}
void Push()
{}
//變量
int* arr;
int capacity;
int size;
};
? ? ?在C++中,類名就是類型,不需要加struct,而且不僅可以定義變量,還可以定義函數(shù)。變量可以通過.
去調(diào)用類里面的函數(shù)。
二、類的定義
class className
{
//類體:由成員變量和成員函數(shù)組成
};
? ? ?class為定義類的關(guān)鍵字,ClassName為類的名字,{}中為類的主體,注意類定義結(jié)束時后面分號不能省略。
類體中內(nèi)容稱為類的成員:類中的變量稱為類的屬性或成員變量; 類中的函數(shù)稱為類的方法或者成員函數(shù)。
??類的兩種定義方式:
- 聲明和定義全部放在類體中
//定義一個人的類 class Person { //成員函數(shù)——顯式基本信息 void showInfo() { cout << _name << "-" << _sex << "-" << _age << "-" << endl; } //成員變量 char* _name;//姓名 char* _sex;//性別 int _age;//年齡 };
注意:成員函數(shù)如果在類中定義,編譯器可能會將其當成內(nèi)聯(lián)函數(shù)處理,最終是否真的是內(nèi)聯(lián),還是由編譯器說了算。
- 類聲明放在.h文件中,成員函數(shù)定義放在.cpp文件中
Person.h文件 //定義一個人的類 class Person { //成員函數(shù)——顯式基本信息 void showInfo(); //成員變量 char* _name;//姓名 char* _sex;//性別 int _age;//年齡 };
Person.cpp文件 #include "Person.h" void Person::showInfo() { cout << _name << "-" << _sex << "-" << _age << "-" << endl; }
注意:成員函數(shù)名前需要加類名: :,告訴編譯器這個函數(shù)屬于哪個類域。長的函數(shù)聲明和定義分離,短的函數(shù)在類中定義。
三、類的訪問限定符
? ? ?C++實現(xiàn)封裝的方式:用類將對象的屬性與方法結(jié)合在一塊,讓對象更加完善,通過訪問權(quán)限選擇性的將其接口提供給外部的用戶使用。C++提供了三種限制權(quán)限的訪問限定符:public、protected、private。
??訪問限定符說明
- public修飾的成員在類外可以直接被訪問(通過對象.訪問)
- protected和private修飾的成員在類外不能直接被訪問(此處protected和private是類似的)
- 訪問權(quán)限作用域從該訪問限定符出現(xiàn)的位置開始直到下一個訪問限定符出現(xiàn)時為止,如果后面沒有訪問限定符,作用域就到 } 即類結(jié)束。
- 如果后面沒有訪問限定符,作用域就到 } 即類結(jié)束。
- class的默認訪問權(quán)限為private,struct的默認訪問權(quán)限為public(因為struct要兼容C)
- 訪問限定符可以修飾類中的成員變量、成員函數(shù)、內(nèi)部類、重命名類型。友元函數(shù)的聲明不受訪問限定符的限制。
注意:類定義數(shù)據(jù)一般是私有的 。
四、類的作用域
? ? ?類定義了一個新的作用域,類的所有成員都在類的作用域中。在類體外定義成員時,需要::
作用域限定符指明成員屬于哪個類域。不同的類域里面可以定義同名變量。
//定義一個人的類
class Person
{
//成員函數(shù)
void Person();
//成員變量
char* _name;//姓名
char* _sex;//性別
int _age;//年齡
};
// 這里需要指定PersonInfo是屬于Person這個類域
void Person::PersonInfo()
{
cout << _name << "-" << _sex << "-" << _age << "-" << endl;
}
? ? ?如上面的成員函數(shù)PersonInfo,對于函數(shù)體中出現(xiàn)的變量_name等,編譯器會先在當前函數(shù)的局部域中搜索,如果沒有找到,接下來會到對應(yīng)的類域里面去搜索,當類域里面也沒有的時候,最后回到全局區(qū)搜索,如果全局也沒有,編譯就會報錯。
五、類的實例化
用類型創(chuàng)建對象的過程,稱為類的實例化。
? ? ?類是對對象進行描述的,是一個模型一樣的東西,限定了類有哪些成員,定義出一個類并沒有分配實際的內(nèi)存空間來存儲它。類和對象的關(guān)系可以看成,拿圖紙建房子的過程,圖紙就是類,建出來的一棟棟房子,就是一個個的對象。
? ? ?一個類可以實例化出多個對象,就像一個圖紙,可以建成很多房子一樣,實例化出的對象占用實際的物理空間,存儲類成員變量。
class Person
{
//成員函數(shù)
void Person::PersonInfo()
//成員變量
char* _name;//姓名
char* _sex;//性別
int _age;//年齡
};
int main()
{
Person p1;//用類實例化一個對象p1
Person p2;//用類實例化一個對象p2
p1._name = "張三";
p1._sex = "男";
p1._age = 19;
return 0;
}
六、this指針
??6.1this指針的引出
? ? ?我們先觀察下面的代碼?
class Date
{
public:
void Init(int year, int month, int day)
{
_year = year;
_month = month;
_day = day;
}
void Print()
{
cout << _year << "-" << _month << "-" << _day << endl;
}
private:
int _year; // 年
int _month; // 月
int _day; // 日
};
int main()
{
Date d1, d2;//定義兩個日期類
d1.Init(2022, 1, 11);//給d1初始化化
d2.Init(2022, 1, 12);//給d2初始化
d1.Print();//調(diào)用Print函數(shù)
d2.Print();//調(diào)用Print函數(shù)
return 0;
}
對于上述類,有這樣的一個問題:
Date類中有 Init 與 Print 兩個成員函數(shù),函數(shù)體中沒有關(guān)于不同對象的區(qū)分,那當d1調(diào)用?Init 函數(shù)時,該函數(shù)是如何知道應(yīng)該設(shè)置d1對象,而不是設(shè)置d2對象呢?
C++中通過引入this指針解決該問題,即:C++編譯器給每個“非靜態(tài)的成員函數(shù)“增加了一個隱藏 的指針參數(shù),讓該指針指向當前對象(函數(shù)運行時調(diào)用該函數(shù)的對象),在函數(shù)體中所有“成員變量” 的操作,都是通過該指針去訪問。只不過所有的操作對用戶是透明的,即用戶不需要來傳遞,編 譯器自動完成。文章來源:http://www.zghlxwxcb.cn/news/detail-755767.html
void Print()
{
cout << _year << "-" << _month << "-" << _day << endl;
}
void Print(Date* const this)
{
cout << this->_year << "-" << this->_month << "-" << this->_day << endl;
}
??6.2 this指針的特性
- ?this指針的類型:類類型* const,即成員函數(shù)中,不能給this指針賦值。
- ?只能在“成員函數(shù)”的內(nèi)部使用.
- ?this指針本質(zhì)上是“成員函數(shù)”的形參,當對象調(diào)用成員函數(shù)時,將對象地址作為實參傳遞給 this形參。所以對象中不存儲this指針。
- ?this指針是“成員函數(shù)”第一個隱含的指針形參,一般情況由編譯器通過ecx寄存器自動傳 遞,不需要用戶傳遞。
本次的內(nèi)容到這里就結(jié)束啦。希望大家閱讀完可以有所收獲,同時也感謝各位讀者三連支持。文章有問題可以在評論區(qū)留言,博主一定認真認真修改,以后寫出更好的文章。你們的支持就是博主最大的動力。文章來源地址http://www.zghlxwxcb.cn/news/detail-755767.html
到了這里,關(guān)于『C++成長記』類和對象的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!