手機(jī)兼職的正規(guī)平臺(tái)有哪些如何優(yōu)化網(wǎng)站排名
目錄
前言:
類和對象的理解
類的引入
類的定義與使用方式
訪問限定符
類的兩種定義方式
成員變量的命名規(guī)則
類的作用域
類的實(shí)例化
類對象模型
計(jì)算類對象的大小
類對象的存儲(chǔ)方式
this指針
前言:
- C語言是面向過程的,關(guān)注的是過程,分析出求解問題的步驟,通過函數(shù)調(diào)用逐步解決問題;
- C++是基于面向?qū)ο?/strong>的,關(guān)注的是對象,將一件事情拆分成不同的對象,靠對象之間的交互完成;
類和對象的理解
類是一個(gè)抽象的概念,描述了一類對象的共同屬性和行為;
對象是類的具體化,它是類的實(shí)例,具有類中定義的屬性和行為;
在C++中,類通常由數(shù)據(jù)成員和成員函數(shù)組成,數(shù)據(jù)成員是類的屬性,它們描述了對象的狀態(tài),成員函數(shù)是類的行為,它們描述了對象可以執(zhí)行的操作,對象的創(chuàng)建是通過類的實(shí)例化來完成的,當(dāng)程序需要使用類時(shí),可以通過創(chuàng)建類的對象來使用類的屬性和行為;
舉例如下:
將“汽車”看作一個(gè)類,在這個(gè)類中定義了汽車的屬性和行為,比如顏色、品牌、速度等屬性,以及加速、剎車、轉(zhuǎn)彎等行為;當(dāng)我們要描述具體一輛汽車時(shí),就需要?jiǎng)?chuàng)建一個(gè)該類的對象,并根據(jù)需要設(shè)置其相應(yīng)的屬性值或?qū)ζ溥M(jìn)行行為操作;
類的引入
由于C++兼容C語言中struct的所有用法,同時(shí)C++對關(guān)鍵字struct進(jìn)行了升級,將struct升級為類;
- ?struct? ? 類名 (類名即為變量類型)
//c語言
struct Stack
{int* a;int top;int capacity;
};
int main()
{//Stack s1; //C語言 ---> 未定義的標(biāo)識符struct Stack s1;//只能采取帶上struct關(guān)鍵字定義變量return 0;
}
//c++
struct Stack
{int* a;int top;int capacity;
};
int main()
{Stack s1;//可直接采取這種方案定義變量,不需要加上struct的關(guān)鍵字return 0;
}
//c語言定義鏈表結(jié)點(diǎn)
struct ListNode
{//ListNode* next;//C語言 ---> 未定義的標(biāo)識符struct ListNode* next;int val;
};
//c++定義鏈表結(jié)點(diǎn)
struct ListNode
{ListNode* next;//編譯通過int val;
};
- C++結(jié)構(gòu)體中可以定義函數(shù);
//c++ 類里面可以定義函數(shù)
struct Stack
{int* a;int top;int capacity;//初始化棧void Init(){a = 0;top = 0;capacity = 0;}
};
?C++用關(guān)鍵字 class 代替 struct;
類的定義與使用方式
class 類名
{//類體: 由成員變量與成員函數(shù)組成}; //此處分號不可省略
類的成員:類中的變量稱為類的屬性或成員變量;類中的函數(shù)稱為類的方法或成員函數(shù);
訪問限定符
C++實(shí)現(xiàn)封裝的方式:用類將對象的屬性與方法結(jié)合在一塊,讓對象更加完善,通過訪問權(quán)限選擇性的將其接口提供給外部的用戶使用;

?訪問限定符說明:
- public修飾的成員在類外可以直接被訪問 ;
- protected和private修飾的成員在類外不能直接被訪問(此處protected和private是類似的)
- 訪問權(quán)限作用域從該訪問限定符出現(xiàn)的位置開始直到下一個(gè)訪問限定符出現(xiàn)時(shí)為止;
- 如果后面沒有訪問限定符,作用域就到 } 即類結(jié)束;
- class的默認(rèn)訪問權(quán)限為private,struct默認(rèn)訪問權(quán)限為public(因?yàn)閟truct要兼容C)
class Stack
{
private:int* a;int top;//a,top,capacity--->成員變量私有int capacity;//private的作用域從private開始到public,若沒有public,直接到類結(jié)束;//由于class的默認(rèn)訪問權(quán)限為私有,省略掉private,三個(gè)成員變量依舊私有
public://初始化棧void Init()// Init()函數(shù)公有{a = 0; top = 0;capacity = 0;}
}; //類結(jié)束
類定義的慣例:成員變量私有,成員函數(shù)公有;
class Stack
{
public:int* a;int top;int capacity;//初始化棧void Init(){a = 0; top = -1;capacity = 0;}//空棧的判斷bool StackEmpty(){return (top == -1);}
};
int main()
{Stack s1;s1.Init();//判斷方式1:空棧, 若top=0,表示指向棧頂元素的下一個(gè)位置;// 空棧, 若top=-1,表示指向棧頂元素的位置;//棧的定義方式不同,如下判斷方法可能導(dǎo)致出錯(cuò);if (s1.top==0)//判斷方式2:采取訪問成員函數(shù)進(jìn)行判斷,直接調(diào)用判空函數(shù),不會(huì)出錯(cuò)if (!s1.StackEmpty()){}//如上就是成員變量私有,成員函數(shù)公有的原因return 0;
}
類的兩種定義方式
定義方式1:類的聲明放在.h文件中,成員函數(shù)定義放在.cpp文件中;
??????????????????? (注:成員函數(shù)名前加 類名 ::)
定義方式2:聲明和定義全部放在類體中;
????????????????? (注:成員函數(shù)如果在類中定義,編譯器可能會(huì)將成員函數(shù)當(dāng)成內(nèi)聯(lián)函數(shù)處理)
成員變量的命名規(guī)則
class Date
{
public:void Init(int year,int month,int day){// 這里的year到底是成員變量,還是函數(shù)形參?year = year;//局部優(yōu)先,year為函數(shù)形參//局部優(yōu)先是指在函數(shù)內(nèi)部創(chuàng)建了一個(gè)和全局變量同名的局部變量時(shí);//函數(shù)內(nèi)部對該變量的操作會(huì)優(yōu)先作用于局部變量,而不會(huì)改變?nèi)肿兞康闹祡
private:int year;int month;int day;
};
為了避免如上情形,C++采用成員變量前加 _
class Date
{
public:void Init(int year,int month,int day){_year = year;}
private:int _year;int _month;int _day;//year month day成員變量前加 _
};
類的作用域
類 定義了一個(gè) 新的作用域, 類的所有成員都在類的作用域中;在 類體外定義成員時(shí),需要使用 ::作用域限定符指明成員屬于哪個(gè) 類域;c++中由{ }所定義的皆為作用域;
class Stack
{//變量的聲明,沒有在內(nèi)存中開辟空間int* a;int top;int capacity;
public:void Init();bool StackEmpty();
};
//需要指定Init()函數(shù)屬于Stack類域
void Stack::Init()
{a = 0;top = 0;capacity = 0;
}
類的實(shí)例化
用類的類型創(chuàng)建對象的過程,稱為類的實(shí)例化;
- 類是對對象進(jìn)行描述的,是一個(gè)模型一樣的東西,限定了類有哪些成員,定義出一個(gè)類并沒有分配實(shí)際的內(nèi)存空間來存儲(chǔ)它;
- 一個(gè)類可以實(shí)例化出多個(gè)對象,實(shí)例化出的對象占用實(shí)際的物理空間,存儲(chǔ)類成員變量
class Date
{
public:void Init(int year,int month,int day){_year = year;}int _year;int _month;int _day;
};
int main()
{Date::_year = 2023;//編譯錯(cuò)誤,成員變量為聲明,沒有開辟內(nèi)存空間存儲(chǔ);// Date d; d.year=2023 //正確做法return 0;
}
//Date類是沒有空間的,只有Date類實(shí)例化出的對象才有具體的年份
3. 類實(shí)例化出對象就像現(xiàn)實(shí)中使用建筑設(shè)計(jì)圖建造出房子,類就像是設(shè)計(jì)圖,只設(shè)計(jì)出需要什么東西,但是并沒有實(shí)體的建筑存在,同樣類也只是一個(gè)設(shè)計(jì),實(shí)例化出的對象才能實(shí)際存儲(chǔ)數(shù)據(jù),占用物理空間;
類對象模型
類對象模型:類對象模型是指將類的成員函數(shù)和成員變量存儲(chǔ)在一起的方式,這種方式將類的成員函數(shù)和成員變量封裝在一個(gè)對象中,通過該對象來訪問類的成員;
計(jì)算類對象的大小
# include <iostream>
using namespace std;
class Date
{
public:void Init(int year,int month,int day){_year = year;}int _year;int _month;int _day;
};
int main()
{Date d;cout << sizeof(d) << endl;return 0;
}
問題:類中既可以有成員變量,又可以有成員函數(shù),那么一個(gè)類的對象中包含了什么?如何計(jì)算一個(gè)類的大小?
類對象的存儲(chǔ)方式
類對象的存儲(chǔ)方式:
對象中只保存成員變量,成員函數(shù)存放在公共代碼段,這種方式將類的成員變量存儲(chǔ)在對象中,而將成員函數(shù)存放在公共代碼段中,通過對象來訪問類的成員函數(shù);
結(jié)論:一個(gè)類的對象大小,實(shí)際就是該類中”成員變量”之和,注意考慮內(nèi)存對齊 ;
空類的大小:空類的大小為1字節(jié);即使一個(gè)類沒有任何成員變量和成員函數(shù),它也會(huì)占用1字節(jié)的內(nèi)存空間;
空的結(jié)構(gòu)體大小:空的結(jié)構(gòu)體大小為0字節(jié),與空類不同,空的結(jié)構(gòu)體不占用任何內(nèi)存空間;
//類中僅有成員函數(shù)--->1byte
//對象中無成員函數(shù)
class B
{
public:void f2() {}
};
int main()
{B b;cout << sizeof(b) << endl;return 0;
}
//空類的大小 ---> 1byte
//無成員變量的類開辟1個(gè)字節(jié),該字節(jié)不存儲(chǔ)有效數(shù)據(jù)
//標(biāo)識定義的對象存在過
class C
{};
int main()
{C c;cout << sizeof(c) << endl;return 0;
}
this指針
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(2023, 12, 17);d2.Init(2023, 12, 16);d1.Print();d2.Print();return 0;
}
運(yùn)行結(jié)果:
Date類中有 Init 與 Print 兩個(gè)成員函數(shù),函數(shù)體中沒有關(guān)于不同對象的區(qū)分,d1調(diào)用的Print()函數(shù)與d2調(diào)用的Print()函數(shù)相同,那當(dāng)d1調(diào)用Print()函數(shù)時(shí),該函數(shù)是如何知道應(yīng)該顯示d1對象,而不是顯示d2對象呢?
C++ 中通過引入 this指針 解決該問題,即: C++編譯器給每個(gè)“非靜態(tài)的成員函數(shù)“增加了一個(gè)隱藏的指針參數(shù),讓該指針指向當(dāng)前對象(函數(shù)運(yùn)行時(shí)調(diào)用該函數(shù)的對象),在函數(shù)體中所有“成員變量” 的操作,都是通過該指針去訪問;只不過所有的操作對用戶是透明的,即用戶不需要來傳遞,編譯器自動(dòng)完成 ;

this指針的特性:
- this指針的類型:類型* const ,由于const修飾this,this指針不允許被修改;
- 只能在“成員函數(shù)”的內(nèi)部使用 (不能顯示的寫實(shí)參和形參,但是可以在類中顯示的使用);
- this指針本質(zhì)上是“成員函數(shù)”的形參,當(dāng)對象調(diào)用成員函數(shù)時(shí),將對象地址作為實(shí)參傳遞給this形參,所以對象中不存儲(chǔ)this指針;
- ?this指針是“成員函數(shù)”第一個(gè)隱含的指針形參,一般情況由編譯器通過ecx寄存器自動(dòng)傳遞,不需要用戶傳遞 ;