C++類與對象(一)-創(chuàng)新互聯(lián)

目錄

創(chuàng)新互聯(lián)從2013年開始,是專業(yè)互聯(lián)網(wǎng)技術服務公司,擁有項目成都做網(wǎng)站、成都網(wǎng)站設計、成都外貿網(wǎng)站建設網(wǎng)站策劃,項目實施與項目整合能力。我們以讓每一個夢想脫穎而出為使命,1280元貴州做網(wǎng)站,已為上家服務,為貴州各地企業(yè)和個人服務,聯(lián)系電話:18980820575

一、面向過程和面向對象認識

二、類的引入

三、類的定義

類的兩種定義方式:

四、類的訪問限定符及封裝

4.1 訪問限定符

4.2 封裝

五、類的作用域

六、類的實例化

七、類對象模型

7.1 如何計算類對象的大小?????

7.2 類對象的存儲方式

7.3 結構體內存對齊規(guī)則

八、this指針

8.1 this指針的引出

8.2 this指針的特性

this指針可以為空嗎?


一、面向過程和面向對象認識

C語言: 面向過程,C語言是面向過程的,關注的是過程,分析出求解問題的步驟,通過函數(shù)調用逐步解決問題,比如干一件事情,第一步第二步,,,,

舉個例子:洗衣服

C++:? 基于面向對象(注意:不是純面向對象的語言,java是純面向對象的語言)原因:C++在C語言基礎上發(fā)展,要兼容C語言,C++是基于面向對象的,關注的是對象,將一件事情拆分成不同的對象,靠對象之間的交互完成

面向對象程序設計有四大特征:抽象? 封裝? ? 繼承? ?多態(tài)

抽象:對一個復雜事務的認識過程

二、類的引入 C 語言結構體中只能定義變量,在 C++ 中,結構體內不僅可以定義變量,也可以定義函數(shù)。 比如:之前在數(shù)據(jù)結構初階中,用C 語言方式實現(xiàn)的棧,結構體中只能定義變量 ;現(xiàn)在以 C++ 方式實現(xiàn),會發(fā)現(xiàn) struct 中也可以 定義函數(shù) 下面就是一個簡單的棧的結構體
#includeusing namespace std;

typedef int DataType;
struct Stack
{
	void Init(size_t capacity)
	{
		_array = (DataType*)malloc(sizeof(DataType) * capacity);
		if (nullptr == _array)
		{
			perror("malloc申請空間失敗");
			return;
		}
		_capacity = capacity;
		_size = 0;
	}
	void Push(const DataType& data)
	{
		// 擴容
		_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;
}
三、類的定義 class 為 定義類的 關鍵字, ClassName 為類的名字, {} 中為類的主體,注意 類定義結束時后面 分號不能省 略 。
class className
{
 // 類體:由成員函數(shù)和成員變量組成
 
}; // 一定要注意后面的分號

類體中內容稱為類的成員:類中的變量稱為類的屬性或成員變量; 類中的函數(shù)稱為類的方法或者成員函數(shù)。

類的兩種定義方式: 1. 聲明和定義全部放在類體中,需注意:成員函數(shù)如果 在類中定義 ,編譯器可能會將其當成 內聯(lián)函數(shù) 處理

例子就上上面棧那個代碼

2. 類聲明放在.h文件中,成員函數(shù)定義放在.cpp文件中,注意:成員函數(shù)名前需要加類名::

絕大部分情況下使用這種方法定義

四、類的訪問限定符及封裝 4.1 訪問限定符 C++ 實現(xiàn)封裝的方式: 用類將對象的屬性與方法結合在一塊,讓對象更加完善,通過訪問權限選擇性的將其 接口提供給外部的用戶使用

【訪問限定符說明】

1. public 修飾的成員在 類外可以直接被訪問 2. protected 和 private 修飾的成員在 類外不能直接被訪問 ( 此處 protected 和 private 是類似的 ) 3. 訪問權限 作用域從該訪問限定符出現(xiàn)的位置開始直到下一個訪問限定符出現(xiàn)時為止 4. 如果后面沒有訪問限定符,作用域就到 } 即類結束。 5. class的默認訪問權限為private,struct為public(因為struct要兼容C) 注意: 訪問限定符只在編譯時有用 ,當數(shù)據(jù)映射到內存后,沒有任何訪問限定符上的區(qū)別

類內:就是class定位的整個括號內部,但是有的函數(shù)位置雖然沒在括號內部,但是它前面加了類名和作用限定符

類外:就是main函數(shù),即不屬于class內的函數(shù)

class student
{
	//類內
};

//類外
int mian{

}

student::------; //類內
問題:C++中struct和class的區(qū)別是什么? 解答:C++需要兼容C語言,所以C++中struct可以當成結構體使用。另外C++中struct還可以用來定義類。和class定義類是一樣的,區(qū)別是struct定義的類默認訪問權限是public,class定義的類默認訪問權限是private 4.2 封裝

面向對象程序設計有四大特征:抽象? 封裝? ? 繼承? ?多態(tài)

封裝:將數(shù)據(jù)和操作數(shù)據(jù)的方法進行有機結合,隱藏對象的屬性和實現(xiàn)細節(jié),僅對外公開接口來和對象進行交互。

封裝本質上是一種管理,讓用戶更方便使用類 。比如:對于電腦這樣一個復雜的設備,提供給用戶的就只有開關機鍵、通過鍵盤輸入,顯示器,USB 插孔等,讓用戶和計算機進行交互,完成日常事務。但實際上電腦真正工作的卻是CPU 、顯卡、內存等一些硬件元件

? ? ? ?在 C++ 語言中實現(xiàn)封裝,可以 通過類將數(shù)據(jù)以及操作數(shù)據(jù)的方法進行有機結合,通過訪問權限來隱藏對象內 部實現(xiàn)細節(jié),控制哪些方法可以在類外部直接被使用

五、類的作用域 類定義了一個新的作用域 ,類的所有成員都在類的作用域中 。 在類體外定義成員時,需要 使用 :: 作用域操作符指明成員屬于哪個類域

類內:就是class定位的整個括號內部,但是有的函數(shù)位置雖然沒在括號內部,但是它前面加了類名和作用限定符

類外:就是main函數(shù),即不屬于class內的函數(shù)

class Person
{
public:   //公開的,都可以在類外被訪問
 void PrintPersonInfo();

private:  //不能直接在類外被訪問了
 char _name[20];
 char _gender[3];
 int _age;
};

// 這里需要指定PrintPersonInfo是屬于Person這個類域
void Person::PrintPersonInfo()
{
 cout<< _name<< " "<< _gender<< " "<< _age<< endl;
}

六、類的實例化 用類類型創(chuàng)建對象的過程,稱為類的實例化 1. 類是對對象進行描述的 ,是一個 模型 一樣的東西,限定了類有哪些成員, 定義出一個類并沒有分配實際的內存空間來存儲它 ;比如:入學時填寫的學生信息表,表格就可以看成是一個類,來描述具體學生信息。 2. 一個類可以實例化出多個對象, 實例化出的對象占用實際的物理空間,存儲類成員變量, 對象是類的具體體現(xiàn) 3. 做個比方。 類實例化出對象就像現(xiàn)實中使用建筑設計圖建造出房子,類就像是設計圖 ,只設計出需要什么東西,但是并沒有實體的建筑存在,同樣類也只是一個設計,實例化出的對象才能實際存儲數(shù)據(jù),占用物理空間

七、類對象模型

對象模型:對象在內存中的布局形式--》簡單來說:對象中包含了什么

7.1 如何計算類對象的大小?????

學習以下代碼

class Date
{
	//一般情況下,成員方法的權限是公有的,成員變量的權限是私有的
	//到底怎么設置,需要根據(jù)應用場景來
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;
}

運行結果顯示,最終只包含了成員變量,計算類大小的時候實際和計算結構體大小的方式一模一樣。

7.2 類對象的存儲方式
// 類中既有成員變量,又有成員函數(shù)
class A1 {
public:
 void f1(){}
private:
 int _a;
};
// 類中僅有成員函數(shù)
class A2 {
public:
 void f2() {}
};
// 類中什么都沒有---空類
class A3
{};
sizeof(A1) : __4__ __ sizeof(A2) : __1__ __ sizeof(A3) : __1__ __

結論:一個類的大小,實際就是該類中”成員變量”之和,當然要注意內存對齊 注意空類的大小,空類比較特殊,編譯器給了空類一個字節(jié)來唯一標識這個類的對象

7.3 結構體內存對齊規(guī)則 1. 第一個成員在與結構體偏移量為 0 的地址處。 2. 其他成員變量要對齊到某個數(shù)字(對齊數(shù))的整數(shù)倍的地址處。 注意:對齊數(shù) = 編譯器默認的一個對齊數(shù) 與 該成員大小的較小值。 VS 中默認的對齊數(shù)為 8 3. 結構體總大小為:大對齊數(shù)(所有變量類型大者與默認對齊參數(shù)取最?。┑恼麛?shù)倍。 4. 如果嵌套了結構體的情況,嵌套的結構體對齊到自己的大對齊數(shù)的整數(shù)倍處,結構體的整體大小就是所有大對齊數(shù)(含嵌套結構體的對齊數(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 類中有 Init 與 Print 兩個成員函數(shù),函數(shù)體中沒有關于不同對象的區(qū)分,那當 d1 調用 Init 函數(shù)時,該函數(shù)是如何知道應該設置d1 對象,而不是設置 d2 對象呢? C++ 中通過引入 this 指針解決該問題 即: C++ 編譯器給每個 “ 非靜態(tài)的成員函數(shù) “ 增加了一個隱藏的指針參 數(shù),讓該指針指向當前對象 ( 函數(shù)運行時調用該函數(shù)的對象 ) ,在函數(shù)體中所有 “ 成員變量 ” 的操作,都是通過該 指針去訪問。只不過所有的操作對用戶是透明的,即用戶不需要來傳遞,編譯器自動完成

8.2 this指針的特性 1. this 指針的類型:類型 * const , 即成員函數(shù)中,不能給this指針賦值 。 2. 只能在 “ 成員函數(shù) ” 的內部使用 3. this 指針本質上是 “ 成員函數(shù) ” 的形參 ,當對象調用成員函數(shù)時,將對象地址作為實參傳遞給 this 形參所以對象中不存儲 this 指針 。 4. this 指針是 “ 成員函數(shù) ” 第一個隱含的指針形參,一般情況由編譯器通過 ecx 寄存器自動傳遞,不需要用 戶傳遞

this指針可以為空嗎?
class A
{
public:
 void Print()
 {
 cout<< "Print()"<< endl;
 }
private:
 int _a;
};
int main()
{
 A* p = nullptr;
 p->Print();
 return 0;
}
程序編譯運行結果是? A 、編譯報錯 B 、運行崩潰 C 、正常運行

你是否還在尋找穩(wěn)定的海外服務器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機房具備T級流量清洗系統(tǒng)配攻擊溯源,準確流量調度確保服務器高可用性,企業(yè)級服務器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧

網(wǎng)頁標題:C++類與對象(一)-創(chuàng)新互聯(lián)
網(wǎng)站路徑:http://muchs.cn/article24/hepce.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供移動網(wǎng)站建設、網(wǎng)站設計網(wǎng)站維護、App設計、定制網(wǎng)站、網(wǎng)站建設

廣告

聲明:本網(wǎng)站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經(jīng)允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)