目錄
一、面向過(guò)程和面向?qū)ο笳J(rèn)識(shí)
二、類(lèi)的引入
三、類(lèi)的定義
類(lèi)的兩種定義方式:
四、類(lèi)的訪問(wèn)限定符及封裝
4.1 訪問(wèn)限定符
4.2 封裝
五、類(lèi)的作用域
六、類(lèi)的實(shí)例化
七、類(lèi)對(duì)象模型
7.1 如何計(jì)算類(lèi)對(duì)象的大小?????
7.2 類(lèi)對(duì)象的存儲(chǔ)方式
7.3 結(jié)構(gòu)體內(nèi)存對(duì)齊規(guī)則
八、this指針
8.1 this指針的引出
8.2 this指針的特性
this指針可以為空嗎?
C語(yǔ)言: 面向過(guò)程,C語(yǔ)言是面向過(guò)程的,關(guān)注的是過(guò)程,分析出求解問(wèn)題的步驟,通過(guò)函數(shù)調(diào)用逐步解決問(wèn)題,比如干一件事情,第一步第二步,,,,
舉個(gè)例子:洗衣服
C++:? 基于面向?qū)ο螅ㄗ⒁猓翰皇羌兠嫦驅(qū)ο蟮恼Z(yǔ)言,java是純面向?qū)ο蟮恼Z(yǔ)言)原因:C++在C語(yǔ)言基礎(chǔ)上發(fā)展,要兼容C語(yǔ)言,C++是基于面向?qū)ο蟮?,關(guān)注的是對(duì)象,將一件事情拆分成不同的對(duì)象,靠對(duì)象之間的交互完成
面向?qū)ο蟪绦蛟O(shè)計(jì)有四大特征:抽象? 封裝? ? 繼承? ?多態(tài)
抽象:對(duì)一個(gè)復(fù)雜事務(wù)的認(rèn)識(shí)過(guò)程
二、類(lèi)的引入 C 語(yǔ)言結(jié)構(gòu)體中只能定義變量,在 C++ 中,結(jié)構(gòu)體內(nèi)不僅可以定義變量,也可以定義函數(shù)。 比如:之前在數(shù)據(jù)結(jié)構(gòu)初階中,用C 語(yǔ)言方式實(shí)現(xiàn)的棧,結(jié)構(gòu)體中只能定義變量 ;現(xiàn)在以 C++ 方式實(shí)現(xiàn),會(huì)發(fā)現(xiàn) struct 中也可以 定義函數(shù) 下面就是一個(gè)簡(jiǎn)單的棧的結(jié)構(gòu)體#includeusing namespace std;
typedef int DataType;
struct Stack
{
void Init(size_t capacity)
{
_array = (DataType*)malloc(sizeof(DataType) * capacity);
if (nullptr == _array)
{
perror("malloc申請(qǐng)空間失敗");
return;
}
_capacity = capacity;
_size = 0;
}
void Push(const DataType& data)
{
// 擴(kuò)容
_array[_size] = data;
++_size;
}
DataType Top()
{
return _array[_size - 1];
}
void Destroy()
{
if (_array)
{
free(_array);
_array = nullptr;
_capacity = 0;
_size = 0;
}
}
DataType* _array;
size_t _capacity;
size_t _size;
};
int main()
{
Stack s;
s.Init(10);
s.Push(1);
s.Push(2);
s.Push(3);
cout<< s.Top()<< endl;
s.Destroy();
return 0;
}
三、類(lèi)的定義
class
為
定義類(lèi)的
關(guān)鍵字,
ClassName
為類(lèi)的名字,
{}
中為類(lèi)的主體,注意
類(lèi)定義結(jié)束時(shí)后面
分號(hào)不能省
略
。
class className
{
// 類(lèi)體:由成員函數(shù)和成員變量組成
}; // 一定要注意后面的分號(hào)
類(lèi)體中內(nèi)容稱(chēng)為類(lèi)的成員:類(lèi)中的變量稱(chēng)為類(lèi)的屬性或成員變量; 類(lèi)中的函數(shù)稱(chēng)為類(lèi)的方法或者成員函數(shù)。
類(lèi)的兩種定義方式: 1. 聲明和定義全部放在類(lèi)體中,需注意:成員函數(shù)如果 在類(lèi)中定義 ,編譯器可能會(huì)將其當(dāng)成 內(nèi)聯(lián)函數(shù) 處理例子就上上面棧那個(gè)代碼
2. 類(lèi)聲明放在.h文件中,成員函數(shù)定義放在.cpp文件中,注意:成員函數(shù)名前需要加類(lèi)名::
絕大部分情況下使用這種方法定義
【訪問(wèn)限定符說(shuō)明】
1. public 修飾的成員在 類(lèi)外可以直接被訪問(wèn) 2. protected 和 private 修飾的成員在 類(lèi)外不能直接被訪問(wèn) ( 此處 protected 和 private 是類(lèi)似的 ) 3. 訪問(wèn)權(quán)限 作用域從該訪問(wèn)限定符出現(xiàn)的位置開(kāi)始直到下一個(gè)訪問(wèn)限定符出現(xiàn)時(shí)為止 4. 如果后面沒(méi)有訪問(wèn)限定符,作用域就到 } 即類(lèi)結(jié)束。 5. class的默認(rèn)訪問(wèn)權(quán)限為private,struct為public(因?yàn)閟truct要兼容C) 注意: 訪問(wèn)限定符只在編譯時(shí)有用 ,當(dāng)數(shù)據(jù)映射到內(nèi)存后,沒(méi)有任何訪問(wèn)限定符上的區(qū)別類(lèi)內(nèi):就是class定位的整個(gè)括號(hào)內(nèi)部,但是有的函數(shù)位置雖然沒(méi)在括號(hào)內(nèi)部,但是它前面加了類(lèi)名和作用限定符
類(lèi)外:就是main函數(shù),即不屬于class內(nèi)的函數(shù)
class student
{
//類(lèi)內(nèi)
};
//類(lèi)外
int mian{
}
student::------; //類(lèi)內(nèi)
問(wèn)題:C++中struct和class的區(qū)別是什么?
解答:C++需要兼容C語(yǔ)言,所以C++中struct可以當(dāng)成結(jié)構(gòu)體使用。另外C++中struct還可以用來(lái)定義類(lèi)。和class定義類(lèi)是一樣的,區(qū)別是struct定義的類(lèi)默認(rèn)訪問(wèn)權(quán)限是public,class定義的類(lèi)默認(rèn)訪問(wèn)權(quán)限是private
4.2 封裝面向?qū)ο蟪绦蛟O(shè)計(jì)有四大特征:抽象? 封裝? ? 繼承? ?多態(tài)
封裝:將數(shù)據(jù)和操作數(shù)據(jù)的方法進(jìn)行有機(jī)結(jié)合,隱藏對(duì)象的屬性和實(shí)現(xiàn)細(xì)節(jié),僅對(duì)外公開(kāi)接口來(lái)和對(duì)象進(jìn)行交互。
封裝本質(zhì)上是一種管理,讓用戶(hù)更方便使用類(lèi) 。比如:對(duì)于電腦這樣一個(gè)復(fù)雜的設(shè)備,提供給用戶(hù)的就只有開(kāi)關(guān)機(jī)鍵、通過(guò)鍵盤(pán)輸入,顯示器,USB 插孔等,讓用戶(hù)和計(jì)算機(jī)進(jìn)行交互,完成日常事務(wù)。但實(shí)際上電腦真正工作的卻是CPU 、顯卡、內(nèi)存等一些硬件元件 ? ? ? ?在 C++ 語(yǔ)言中實(shí)現(xiàn)封裝,可以 通過(guò)類(lèi)將數(shù)據(jù)以及操作數(shù)據(jù)的方法進(jìn)行有機(jī)結(jié)合,通過(guò)訪問(wèn)權(quán)限來(lái)隱藏對(duì)象內(nèi) 部實(shí)現(xiàn)細(xì)節(jié),控制哪些方法可以在類(lèi)外部直接被使用五、類(lèi)的作用域 類(lèi)定義了一個(gè)新的作用域 ,類(lèi)的所有成員都在類(lèi)的作用域中 。 在類(lèi)體外定義成員時(shí),需要 使用 :: 作用域操作符指明成員屬于哪個(gè)類(lèi)域類(lèi)內(nèi):就是class定位的整個(gè)括號(hào)內(nèi)部,但是有的函數(shù)位置雖然沒(méi)在括號(hào)內(nèi)部,但是它前面加了類(lèi)名和作用限定符
類(lèi)外:就是main函數(shù),即不屬于class內(nèi)的函數(shù)
class Person
{
public: //公開(kāi)的,都可以在類(lèi)外被訪問(wèn)
void PrintPersonInfo();
private: //不能直接在類(lèi)外被訪問(wèn)了
char _name[20];
char _gender[3];
int _age;
};
// 這里需要指定PrintPersonInfo是屬于Person這個(gè)類(lèi)域
void Person::PrintPersonInfo()
{
cout<< _name<< " "<< _gender<< " "<< _age<< endl;
}
對(duì)象模型:對(duì)象在內(nèi)存中的布局形式--》簡(jiǎn)單來(lái)說(shuō):對(duì)象中包含了什么
7.1 如何計(jì)算類(lèi)對(duì)象的大小?????學(xué)習(xí)以下代碼
class Date
{
//一般情況下,成員方法的權(quán)限是公有的,成員變量的權(quán)限是私有的
//到底怎么設(shè)置,需要根據(jù)應(yīng)用場(chǎng)景來(lái)
public:
void InitDate(int year, int month, int day)
{
_year = year;
_month = month;
_day = day;
}
void PrintDate()
{
cout<< _year<< "/"<< _month<< "/"<< _day<< endl;
}
private:
int _year;
int _month;
int _day;
};
int main()
{
Date d;
Date dd;
d.InitDate(2022, 11, 20);
d.PrintDate();
dd.InitDate(2022, 11, 21);
dd.PrintDate();
cout<< sizeof(Date)<< endl;
cout<< sizeof(d)<< endl;
return 0;
}
運(yùn)行結(jié)果顯示,最終只包含了成員變量,計(jì)算類(lèi)大小的時(shí)候?qū)嶋H和計(jì)算結(jié)構(gòu)體大小的方式一模一樣。
7.2 類(lèi)對(duì)象的存儲(chǔ)方式// 類(lèi)中既有成員變量,又有成員函數(shù)
class A1 {
public:
void f1(){}
private:
int _a;
};
// 類(lèi)中僅有成員函數(shù)
class A2 {
public:
void f2() {}
};
// 類(lèi)中什么都沒(méi)有---空類(lèi)
class A3
{};
sizeof(A1) :
__4__
__ sizeof(A2) :
__1__
__ sizeof(A3) :
__1__
__
結(jié)論:一個(gè)類(lèi)的大小,實(shí)際就是該類(lèi)中”成員變量”之和,當(dāng)然要注意內(nèi)存對(duì)齊
注意空類(lèi)的大小,空類(lèi)比較特殊,編譯器給了空類(lèi)一個(gè)字節(jié)來(lái)唯一標(biāo)識(shí)這個(gè)類(lèi)的對(duì)象7.3 結(jié)構(gòu)體內(nèi)存對(duì)齊規(guī)則
1.
第一個(gè)成員在與結(jié)構(gòu)體偏移量為
0
的地址處。
2.
其他成員變量要對(duì)齊到某個(gè)數(shù)字(對(duì)齊數(shù))的整數(shù)倍的地址處。
注意:對(duì)齊數(shù)
=
編譯器默認(rèn)的一個(gè)對(duì)齊數(shù) 與 該成員大小的較小值。
VS
中默認(rèn)的對(duì)齊數(shù)為
8
3.
結(jié)構(gòu)體總大小為:大對(duì)齊數(shù)(所有變量類(lèi)型大者與默認(rèn)對(duì)齊參數(shù)取最?。┑恼麛?shù)倍。
4.
如果嵌套了結(jié)構(gòu)體的情況,嵌套的結(jié)構(gòu)體對(duì)齊到自己的大對(duì)齊數(shù)的整數(shù)倍處,結(jié)構(gòu)體的整體大小就是所有大對(duì)齊數(shù)(含嵌套結(jié)構(gòu)體的對(duì)齊數(shù))的整數(shù)倍。八、this指針
8.1 this指針的引出class Date
{
public:
void Init(int year, int month, int day)
{
_year = year;
_month = month;
_day = day;
}
void Print()
{
cout<<_year<< "-"<<_month<< "-"<< _day<
Date
類(lèi)中有
Init
與
Print
兩個(gè)成員函數(shù),函數(shù)體中沒(méi)有關(guān)于不同對(duì)象的區(qū)分,那當(dāng)
d1
調(diào)用
Init
函數(shù)時(shí),該函數(shù)是如何知道應(yīng)該設(shè)置d1
對(duì)象,而不是設(shè)置
d2
對(duì)象呢?
C++
中通過(guò)引入
this
指針解決該問(wèn)題
即:
C++
編譯器給每個(gè)
“
非靜態(tài)的成員函數(shù)
“
增加了一個(gè)隱藏的指針參
數(shù),讓該指針指向當(dāng)前對(duì)象
(
函數(shù)運(yùn)行時(shí)調(diào)用該函數(shù)的對(duì)象
)
,在函數(shù)體中所有
“
成員變量
”
的操作,都是通過(guò)該
指針去訪問(wèn)。只不過(guò)所有的操作對(duì)用戶(hù)是透明的,即用戶(hù)不需要來(lái)傳遞,編譯器自動(dòng)完成8.2 this指針的特性
1.
this
指針的類(lèi)型:類(lèi)型
* const
,
即成員函數(shù)中,不能給this指針賦值
。
2.
只能在
“
成員函數(shù)
”
的內(nèi)部使用
3.
this
指針本質(zhì)上是
“
成員函數(shù)
”
的形參
,當(dāng)對(duì)象調(diào)用成員函數(shù)時(shí),將對(duì)象地址作為實(shí)參傳遞給
this
形參所以對(duì)象中不存儲(chǔ)
this
指針
。
4.
this
指針是
“
成員函數(shù)
”
第一個(gè)隱含的指針形參,一般情況由編譯器通過(guò)
ecx
寄存器自動(dòng)傳遞,不需要用
戶(hù)傳遞class A
{
public:
void Print()
{
cout<< "Print()"<< endl;
}
private:
int _a;
};
int main()
{
A* p = nullptr;
p->Print();
return 0;
}
程序編譯運(yùn)行結(jié)果是?
A
、編譯報(bào)錯(cuò)
B
、運(yùn)行崩潰
C
、正常運(yùn)行你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購(gòu),新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧
網(wǎng)頁(yè)標(biāo)題:C++類(lèi)與對(duì)象(一)-創(chuàng)新互聯(lián)
網(wǎng)站路徑:http://jinyejixie.com/article24/hepce.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供移動(dòng)網(wǎng)站建設(shè)、網(wǎng)站設(shè)計(jì)、網(wǎng)站維護(hù)、App設(shè)計(jì)、定制網(wǎng)站、網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容