亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

C++初識(shí)類和對(duì)象

 更新時(shí)間:2021年10月21日 15:23:55   作者:藍(lán)樂(lè)  
類是創(chuàng)建對(duì)象的模板,一個(gè)類可以創(chuàng)建多個(gè)對(duì)象,每個(gè)對(duì)象都是類類型的一個(gè)變量;創(chuàng)建對(duì)象的過(guò)程也叫類的實(shí)例化。每個(gè)對(duì)象都是類的一個(gè)具體實(shí)例(Instance),擁有類的成員變量和成員函數(shù)

一.初步認(rèn)識(shí)面向過(guò)程和面向?qū)ο?/h2>

面向過(guò)程,關(guān)注的是怎么去做,比如在外賣(mài)系統(tǒng)中,強(qiáng)調(diào)點(diǎn)餐,做餐,送餐等一系列動(dòng)作的方法,反映到語(yǔ)言中是函數(shù)方法的實(shí)現(xiàn);而面向?qū)ο螅P(guān)注的是誰(shuí)去做,比如在外賣(mài)系統(tǒng)中,強(qiáng)調(diào)的是商家,買(mǎi)家和送貨員之間的交互,反映到語(yǔ)言中則是對(duì)象的實(shí)現(xiàn)。

在這里插入圖片描述

C語(yǔ)言是面向過(guò)程的,關(guān)注的是過(guò)程,分析出求解問(wèn)題的步驟,通過(guò)函數(shù)調(diào)用逐步解決問(wèn)題。

C++是基于面向?qū)ο蟮?,關(guān)注的是對(duì)象,將一件事情拆分成不同的對(duì)象,靠對(duì)象之間的交互完成。

這里C++由于兼容C語(yǔ)言,因此既是面向過(guò)程,又是面向?qū)ο蟮?,但是C++更關(guān)注的是對(duì)象,所以說(shuō)C++是基于面向?qū)ο蟮摹?/p>

二.類的引入

在C語(yǔ)言中,結(jié)構(gòu)體只能定義變量,而在C++中,結(jié)構(gòu)體升級(jí)為類,既可以定義變量,也可以定義函數(shù):

struct Book
{
	void SetInfo(const char* name, const char* writer, double price)//建立書(shū)本信息
	{
		strcpy(_name, name);
		strcpy(_writer, writer);
		_price = price;
	}
	void PrintInfo()//打印書(shū)本信息
	{
		cout << _name << endl;
		cout << _writer << endl;
		cout << _price << endl;
	}
	char _name[20];
	char _writer[20];
	double _price;
};
int main()
{
	Book b1;
	Book b2;
	b1.SetInfo("老人與海", "海明威", 12.54);
	b2.SetInfo("駱駝祥子", "老舍", 14.88);
	b1.PrintInfo();
	cout << endl;
	b2.PrintInfo();
	return 0;
}

上面的結(jié)構(gòu)體struct即為一個(gè)類,{}則形成了一個(gè)類域,{}中的內(nèi)容為結(jié)構(gòu)體Book的成員,既有成員變量,又有成員函數(shù)。在C++中,類通常用class這個(gè)關(guān)鍵字來(lái)表示。那么struct和class二者之間有什么區(qū)別呢?接下來(lái)我們就來(lái)介紹類。

三.類的定義

class className
{
 // 類體:由成員函數(shù)和成員變量組成
}; // 一定要注意后面的分號(hào)

class為定義類的關(guān)鍵字,ClassName為類的名字,{}中為類的主體,注意類定義結(jié)束時(shí)后面分號(hào)。

類中的元素稱為類的成員:類中的數(shù)據(jù)稱為類的屬性或者成員變量; 類中的函數(shù)稱為類的方法或者成員函數(shù)。

類的兩種定義方式:

1.定義和聲明全部放在類體中,需要注意的是:

成員函數(shù)被定義在類體中,編譯器會(huì)默認(rèn)將其當(dāng)作內(nèi)聯(lián)函數(shù),其效用等同于函數(shù)前加上inline關(guān)鍵字,若不知道何為內(nèi)聯(lián)函數(shù),可以參考之前文章中關(guān)于內(nèi)聯(lián)函數(shù)的介紹。

C++入門(mén)

在這里插入圖片描述

2.聲明與定義分離

聲明放在頭文件中,而定義放在源文件中。

在這里插入圖片描述

通常情況下,為了代碼的規(guī)范性,更傾向于采用第二種方法來(lái)實(shí)現(xiàn)類,并且代碼較短的成員函數(shù)直接定義在類體中,而代碼較長(zhǎng)的函數(shù)定義在類體外。

需要注意的是,類中的成員變量均為聲明,它們?cè)趯?shí)例化之前都未被分配空間,不能稱作為定義。

四.類的訪問(wèn)限定符及封裝

1.訪問(wèn)限定符

在之前我們討論到class和struct之間有什么區(qū)別,那么這里我們將會(huì)介紹,首先,我們來(lái)了解以下類的訪問(wèn)限定符及封裝。
C++實(shí)現(xiàn)封裝的方式:用類將對(duì)象的屬性與方法結(jié)合在一塊,讓對(duì)象更加完善,通過(guò)訪問(wèn)權(quán)限選擇性的將其接口提供給外部的用戶使用。

在這里插入圖片描述

訪問(wèn)限定符的說(shuō)明:

1.public修飾的成員在類外可以直接被訪問(wèn)

2.protected和private修飾的成員在類外不能直接被訪問(wèn)(此處protected和private是類似的)

3.訪問(wèn)權(quán)限作用域從該訪問(wèn)限定符出現(xiàn)的位置開(kāi)始直到下一個(gè)訪問(wèn)限定符出現(xiàn)時(shí)為止

4.在沒(méi)有訪問(wèn)限定符的情況下,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ū)別。

由上面的說(shuō)明我們就可以知道struct和class這兩個(gè)關(guān)鍵字之間的區(qū)別在哪里了:實(shí)際使用過(guò)程中,struct和class定義類時(shí)并無(wú)區(qū)別,只是在二者均沒(méi)有訪問(wèn)限定符的時(shí)候,struct默認(rèn)的訪問(wèn)權(quán)限為public,而class默認(rèn)的訪問(wèn)權(quán)限為private。

2.封裝

我們知道面向?qū)ο笥腥筇匦裕悍庋b,繼承,多態(tài)。在類和對(duì)象階段,我們研究類的封裝特性。

首先,封裝指的是將數(shù)據(jù)和操作數(shù)據(jù)的方法進(jìn)行有機(jī)結(jié)合,隱藏對(duì)象的屬性和實(shí)現(xiàn)細(xì)節(jié),僅對(duì)外公開(kāi)接口來(lái)和對(duì)象進(jìn)行交互。

其次,從本質(zhì)上來(lái)說(shuō),封裝是一種管理:舉個(gè)例子,景區(qū)如果不加管理的話,那么景區(qū)的東西很可能會(huì)被不守規(guī)章制度的人破壞,這就好比C語(yǔ)言中為被封裝的代碼隨時(shí)可能被修改,有時(shí)導(dǎo)致出現(xiàn)很大的錯(cuò)誤;那么為了加強(qiáng)管理,保護(hù)景區(qū),就需要設(shè)立景點(diǎn)售票口,同時(shí)安裝監(jiān)控和保安來(lái)保證景區(qū)不被破壞。

類也是如此,對(duì)于我們不想被隨意修改的成員變量,我們用private表示其為私有,而為了使用者能夠合理調(diào)用,我們將使用方法封裝成一個(gè)個(gè)的接口即成員函數(shù)用public表示其為公用,至此我們將成員封裝起來(lái),同時(shí)開(kāi)放一些公有的成員函數(shù)對(duì)成員合理的訪問(wèn)。所以封裝本質(zhì)是一種管理,使用封裝可以是代碼更加安全。

在這里插入圖片描述

五.類的作用域

類定義了一個(gè)新的作用域,類的所有成員都在類的作用域中。在類體外定義成員,需要使用 :: 作用域解析符指明成員屬于哪個(gè)類域。

比如,在上面介紹類的第二種實(shí)現(xiàn)方式中的代碼,在Book.cpp中定義函數(shù)ShowInfo時(shí)就是指定其為類域Book中的成員函數(shù)。

//Book.h
class Book//書(shū)
{
public:
	void ShowInfo();//展示書(shū)的信息
private:
	char* _name;//書(shū)名
	char* _writer;//作者
	double _price;//價(jià)格
//Book.cpp
#include "test.h"
void Book::ShowInfo()
{
	cout << _name << " " << _writer << " " << _price << endl;
}
};

六.類的實(shí)例化

用類類型創(chuàng)建對(duì)象的過(guò)程,稱為類的實(shí)例化

1.類只是一個(gè)模型一樣的東西,限定了類有哪些成員,定義出一個(gè)類并沒(méi)有分配實(shí)際的內(nèi)存空間來(lái)存儲(chǔ)它

2.一個(gè)類可以實(shí)例化出多個(gè)對(duì)象,實(shí)例化出的對(duì)象占用實(shí)際的物理空間,存儲(chǔ)類成員變量

3.打個(gè)比方,類實(shí)例化出對(duì)象就像現(xiàn)實(shí)中使用建筑設(shè)計(jì)圖建造出房子,類就像是設(shè)計(jì)圖,只設(shè)計(jì)出需要什么東西,但是并沒(méi)有實(shí)體的建筑存在,同樣類也只是一個(gè)設(shè)計(jì),實(shí)例化出的對(duì)象才能實(shí)際存儲(chǔ)數(shù)據(jù),占用物理空間

在這里插入圖片描述

在這里插入圖片描述

七.類對(duì)象模型

1.計(jì)算類對(duì)象的大小

類包含了成員變量和成員函數(shù),那么類的大小應(yīng)該如何計(jì)算呢?首先我們來(lái)看看下面這個(gè)代碼的結(jié)果是什么:

class Book
{
public:
	void ShowInfo(){}
private:
	char* _name;
	char* _writer;
	double _price;
};
int main()
{
	cout << sizeof(Book) << endl;
	return 0;
}

在這里插入圖片描述

可以看到,類Book的大小為16,那么這個(gè)16是怎么求出來(lái)的呢?

2.類對(duì)象的存儲(chǔ)方式

我們?cè)賮?lái)看一個(gè)代碼:

class C1//類中既有成員變量,又有成員函數(shù)
{
public:
	void fun();
private:
	int _a;
};
class C2//類中只有成員函數(shù)
{
public:
	void fun();
};
class C3//類中什么都沒(méi)有,即空類
{
};
int main()
{
	cout << "C1:" << sizeof(C1) << endl;
	cout << "C2:" << sizeof(C2) << endl;
	cout << "C3:" << sizeof(C3) << endl;
	return 0;
}

它的結(jié)果是:

在這里插入圖片描述

可以看到C1的大小為成員變量_a的大小,C2和C3的大小均為1,說(shuō)明類的大小并不包括成員函數(shù)的大小,實(shí)際上如果類實(shí)例化時(shí)也會(huì)給成員函數(shù)開(kāi)辟一塊空間,那么當(dāng)一個(gè)類創(chuàng)建多個(gè)對(duì)象時(shí),每個(gè)對(duì)象中都會(huì)保存一份成員函數(shù)的代碼,相同代碼保存多次,浪費(fèi)空間。

既然成員函數(shù)不在類的大小計(jì)算范圍內(nèi),那么為什么空類的大小為1呢?這是因?yàn)橐粋€(gè)類創(chuàng)建的時(shí)候需要開(kāi)辟一塊空間來(lái)占位,因此內(nèi)存需要開(kāi)辟一個(gè)字節(jié),這個(gè)字節(jié)的空間是沒(méi)有意義的,其不存儲(chǔ)任何有效數(shù)據(jù),但是其標(biāo)識(shí)了空類的存在。

在這里插入圖片描述

結(jié)論:一個(gè)類的大小,實(shí)際就是該類中”成員變量”之和,當(dāng)然也要進(jìn)行內(nèi)存對(duì)齊,注意空類的大小,空類比較特殊,編譯器給了空類一個(gè)字節(jié)來(lái)唯一標(biāo)識(shí)這個(gè)類。

八.this指針

1.this指針的引出

不知道你是否注意到,在C和C++實(shí)現(xiàn)棧的代碼中,二者的函數(shù)參數(shù)有些許不同

在這里插入圖片描述

可以看到,C++的函數(shù)參數(shù)比起C語(yǔ)言實(shí)現(xiàn)的函數(shù)都少了一個(gè)參數(shù),那么問(wèn)題來(lái)了,在下面代碼中s1和s2都調(diào)用Init函數(shù)時(shí),編譯器是怎么區(qū)別是哪個(gè)變量調(diào)用的呢?這就是我們即將要介紹的this指針?biāo)鸬降淖饔昧恕?/p>

int main()
{
	cpp::Stack s1;
	cpp::Stack s2;
	s1.Init();
	s2.Init();
	s1.Push(1);
	return 0;
}

實(shí)際上,C++編譯器給每個(gè)“非靜態(tài)的成員函數(shù)“增加了一個(gè)隱藏的指針參數(shù),讓該指針指向當(dāng)前對(duì)象(函數(shù)運(yùn)行時(shí)調(diào)用該函數(shù)的對(duì)象),在函數(shù)體中所有成員變量的操作,都是通過(guò)該指針去訪問(wèn)。只不過(guò)所有的操作對(duì)用戶是透明的,即用戶不需要來(lái)傳遞,編譯器自動(dòng)完成。

在這里插入圖片描述

根據(jù)調(diào)試窗口可以看到this指針就是s1的地址,通過(guò)this指針可以訪問(wèn)s1。

2.this指針的特性

1.this指針的類型:類類型* const,比如上面代碼中的this指針類型為Stack*

2.只能在“成員函數(shù)”的內(nèi)部使用,this作為一個(gè)關(guān)鍵字不能拿它去當(dāng)作變量的名字,其使用時(shí)可以顯式的使用,比如:

		void Init() 
		{
			this->_a = (int*)malloc(sizeof(int) * 4);
			this->_top = 0;
			this->_capacity = 4;
		}

3.this指針本質(zhì)上其實(shí)是一個(gè)成員函數(shù)的形參,是對(duì)象調(diào)用成員函數(shù)時(shí),將對(duì)象地址作為實(shí)參傳遞給this形參。所以對(duì)象中不存儲(chǔ)this指針。又因?yàn)閠his指針為形參,而形參和函數(shù)中的局部變量是存儲(chǔ)在函數(shù)棧幀中的,因此this指針可以認(rèn)為是存儲(chǔ)在棧中的。

4.this指針是成員函數(shù)第一個(gè)隱含的指針形參,一般情況由編譯器通過(guò)ecx寄存器自動(dòng)傳遞,不需要用戶傳遞.

在這里插入圖片描述

我們最后再來(lái)看一個(gè)問(wèn)題:this指針可以為空嗎?

我們還是通過(guò)一個(gè)代碼來(lái)看:

class A
{
public:
	void Show()
	{
		cout << "Show()" << endl;
	}
	void Print()
	{
		cout << _a << endl;
	}
private:
	int _a;
};
int main()
{
	A* p = nullptr;
	p->Show();
	p->Print();
	return 0;
}

那么p->Show(); p->Print();這兩句代碼能否運(yùn)行成功呢?

在這里插入圖片描述

在這里插入圖片描述

可以看到第一句代碼運(yùn)行成功了,而第二句代碼運(yùn)行崩潰了。

這是因?yàn)槌蓡T函數(shù)的地址并不存在于對(duì)象中,而是存在于公共代碼段;而上面的代碼中調(diào)用函數(shù)時(shí)將p傳給了隱含的this指針,并不會(huì)去訪問(wèn)p所指向的空間,就不存在空指針的解引用,因此程序可以并編譯成功。而調(diào)用Show函數(shù)也沒(méi)有對(duì)this指針解引用,因此程序運(yùn)行成功了;調(diào)用Print函數(shù)則會(huì)對(duì)this指針解引用,故程序崩潰了。

結(jié)論:對(duì)于調(diào)用不會(huì)對(duì)this指針解引用的函數(shù),this指針可以為空;而對(duì)于調(diào)用會(huì)對(duì)this指針解引用的函數(shù),this指針不能為空。

總結(jié)

本篇文章就到這里了,希望能夠給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!

相關(guān)文章

  • C語(yǔ)言進(jìn)階練習(xí)二叉樹(shù)的遞歸遍歷

    C語(yǔ)言進(jìn)階練習(xí)二叉樹(shù)的遞歸遍歷

    樹(shù)是一種重要的非線性數(shù)據(jù)結(jié)構(gòu),直觀地看,它是數(shù)據(jù)元素(在樹(shù)中稱為結(jié)點(diǎn))按分支關(guān)系組織起來(lái)的結(jié)構(gòu),很象自然界中的樹(shù)那樣。樹(shù)結(jié)構(gòu)在客觀世界中廣泛存在,如人類社會(huì)的族譜和各種社會(huì)組織機(jī)構(gòu)都可用樹(shù)形象表示,本篇介紹二叉樹(shù)的遞歸與非遞歸遍歷的方法
    2022-06-06
  • 基于C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單的走迷宮游戲

    基于C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單的走迷宮游戲

    這篇文章主要介紹了基于C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單的走迷宮游戲,用到雙向隊(duì)列,方便在運(yùn)行完畢后輸出經(jīng)過(guò)的點(diǎn),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-04-04
  • OPENCV批量讀取圖片實(shí)現(xiàn)方法

    OPENCV批量讀取圖片實(shí)現(xiàn)方法

    下面小編就為大家?guī)?lái)一篇OPENCV批量讀取圖片實(shí)現(xiàn)方法。小編覺(jué)得挺不錯(cuò)的。現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-06-06
  • 詳解C++中的ANSI與Unicode和UTF8三種字符編碼基本原理與相互轉(zhuǎn)換

    詳解C++中的ANSI與Unicode和UTF8三種字符編碼基本原理與相互轉(zhuǎn)換

    在C++編程中,我們有時(shí)需要去處理字符串編碼的相關(guān)問(wèn)題,常見(jiàn)的字符編碼有ANSI窄字節(jié)編碼、Unicode寬字節(jié)編碼及UTF8可變長(zhǎng)編碼。很多人在處理字符串編碼問(wèn)題時(shí)都會(huì)有疑惑,即便是有多年工作經(jīng)驗(yàn)的朋友也可能搞不清楚。所以有必要講一下這三種字符編碼以及如何去使用它們
    2021-11-11
  • C語(yǔ)言中指針的加減運(yùn)算方法示例

    C語(yǔ)言中指針的加減運(yùn)算方法示例

    這篇文章主要給大家介紹了關(guān)于C語(yǔ)言中指針的加減運(yùn)算的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用C語(yǔ)言具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08
  • 變量定義與聲明的區(qū)別詳細(xì)解析

    變量定義與聲明的區(qū)別詳細(xì)解析

    外部變量(全局變量)的"定義"與外部變量的"聲明"是不相同的,外部變量的定義只能有一次,它的位置是在所有函數(shù)之外,而同一個(gè)文件中的外部變量聲明可以是多次的,它可以在函數(shù)之內(nèi)(哪個(gè)函數(shù)要用就在那個(gè)函數(shù)中聲明)也可以在函數(shù)之外(在外部變量的定義點(diǎn)之前)
    2013-09-09
  • 舉例講解C語(yǔ)言對(duì)歸并排序算法的基礎(chǔ)使用

    舉例講解C語(yǔ)言對(duì)歸并排序算法的基礎(chǔ)使用

    這篇文章主要介紹了C語(yǔ)言對(duì)歸并排序算法的使用,歸并排序算法的平均事件復(fù)雜度為(n\log n),需要的朋友可以參考下
    2016-05-05
  • linux下基于C語(yǔ)言的信號(hào)編程實(shí)例

    linux下基于C語(yǔ)言的信號(hào)編程實(shí)例

    這篇文章主要介紹了linux下基于C語(yǔ)言的信號(hào)編程,實(shí)例分析了信號(hào)量的基本使用技巧與相關(guān)概念,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-07-07
  • C#委托所蘊(yùn)含的函數(shù)指針概念詳細(xì)解析

    C#委托所蘊(yùn)含的函數(shù)指針概念詳細(xì)解析

    C#中用委托這種概念實(shí)現(xiàn)了函數(shù)指針技術(shù)而已,另外.ent提供額外的安全性,當(dāng)然也損失了靈活性
    2013-09-09
  • c++實(shí)現(xiàn)圖像像素計(jì)算的示例詳解

    c++實(shí)現(xiàn)圖像像素計(jì)算的示例詳解

    我們知道每張圖像都能夠用矩陣來(lái)表示,矩陣中每個(gè)元素的值表示了圖像中每個(gè)像素值,像素值的大小就對(duì)應(yīng)著圖像的亮暗,本文主要來(lái)和大家介紹一下C++進(jìn)行圖像像素計(jì)算的相關(guān)知識(shí),感興趣的可以了解下
    2023-12-12

最新評(píng)論