C++基礎之類

#對象#

具有某種身份的事物就是對象

在應用領域中有意義的、與所要解決的問題有關係的任何事物都可以作爲對象,它既可以是具體的物理實體的抽象,也可以是人爲的概念,或者是人和有明確邊界和意義的東西。任何事物都可以用對象來進行描述——萬物皆對象。

##C++中對象的定義

對象是一組數據以及對這組數據有關操作組合封裝的實體,這組數據也可以稱爲對象的具體屬性,例如人的身高、體重;有關操作可以理解爲對象的行爲,如,讀書、寫字

##對象的性質
對象具有唯一性,正如世界上沒有相同的樹葉一樣,每個對象都是獨一無二的。在C++中,每個對象都有自身唯一的標識,通過這種標識,可找到相應的對象。在對象的整個生命期中,它的標識都不改變,不同的對象不能有相同的標識。
#類

具有相同屬性(數據元素)和行爲(功能)的對象的抽象就是類

類的實質是一種數據類型,由用戶自定義的數據類型。在編程中,類不能直接進行操作,需要用類定義具體的對象,對這對象進行操作。類是對象的抽象,對象是類的實現。

##類的性質

封裝性

將數據和操作封裝爲一個有機的整體,由於類中私有成員都是隱藏的,只向外部提供有限的接口,所以能夠保證內部的高內聚性和與外部的低耦合性。

繼承性

繼承性更符合認知規律,使程序更易於理解,同時節省不必要的重複代碼。

多態性

同一操作作用於不同對象,可以有不同的解釋,產生不同的執行結果。

##類的實現及基本結構
C++中的類與C語言中的結構體非常相似,區別是類由class開頭,結構體由struct開始,最重要的就是類中的數據及操作默認爲私有,不特別規定不能調用,結構體則相反,另外關於構造函數以及析構函數等下面講。

類由數據成員以及在數據成員進行操作的方法組成

class Test//類名
{
	int a;//數據成員
	int b;//數據成員
	void getAB()//方法 得到a、b的值
	{
		cout <<a <<" " << b;
	}
};//分號結束

注意事項:類在命名時首字母大寫

##類內的訪問權限
前面提到類內成員在不做特殊規定時,內部成員不能調用,這主要是C++在設計是對數據安全性進行的考慮,如果類中的數據可以隨意訪問調用將造成極大的安全隱患。C++爲類內的成員提供三種權限:public(公有)、protected(保護)、private(私有)

public:公有的,這種權限下類內成員可以隨意調用

protected:這種權限下類內成員只能被本類成員以及派生類調用(友元除外)

pravate:這種權限下類內成員只能由本類的成員調用(友元除外)

class Test2
{
public:
	int a;//公有數據成員
private:
	int b;//私有數據成員
protected:
	int c;//被保護的數據成員
public:
	int setABC(int a,int b, int c)//公有成員方法
	{
		this->a = a;
    	this->b = b;
    	this->c = c;
	}
	void getABC()//公有成員方法
	{
		cout <<a <<" " << b<<" "<< c;
	}
};

在C++中類內權限範圍由權限標識開始到下一個權限標識或類的定義止,這一範圍內都爲前一標識的作用範圍,例如setABC()、getABC()都爲公有權限

類內的私有權限的數據成員只能由本類的成員調用,例如setABC()、getABC()可以操作數據新成員 c

##this
在C++中提供了一種指針——this指針,使用它在成員函數中來代替對象本身來對數據成員進行操作,例如Test2中setABC方法使用this來對abc進行賦值,如果我們不用this,直接用數據成員 來進行操作

int setABC(int a,int b, int c)//公有成員方法
	{
		a = a;
		b = b;
		c = c;
	}

那麼編譯器將會報錯,因爲指代不明

this指針不是我們定義的,在對象創建時由編譯器自動生成,this的使用範圍只限於類內成員函數中使用
##構造函數以及析構函數

類定義好了,我們要使用它,但是類的本質是一種數據類型,我們並不能直接對類進行操作,參照結構體 我們可以使用類名來定義一個變量,這個變量就叫做對象。在創建變量的時候都可以進行初始化,對數據進行初步賦值,對象當然也可以進行初始化,C++爲我們提供了構造函數

其實無論Test 還是Test2 類,編譯器都自動加上了構造函數,這是類的必要組成部分,我們不寫當然不會報錯,編譯器會幫我們加上一個默認的構造函數

構造函數與類名相同,沒有返回類型,一個類中可以編寫多個參數列表不同的構造函數——構造函數支持重載,另外構造函數支持參數列表初始化

Test2()
{
	a = 1;
	b = 2;
	c = 3;
}
Test2(int a, int b)
{
	this->a = a;
	this->b = b;
	c = 3;
}
Test2(int a, int b, int c):a(a),b(b),c(c){}

析構函數與構造函數相反,當對象結束其生命週期時(例如對象所在的函數已調用完畢),系統自動執行析構函數。析構函數往往用來做“清理善後” 的工作(例如在建立對象時用new開闢了一片內存空間,delete會自動調用析構函數後釋放內存)。

~Test2(){}

##繼承

通過繼承機制,可以利用已有的數據類型來定義新的數據類型。所定義的新的數據類型不僅擁有新定義的成員,而且還同時擁有舊的成員。我們稱已存在的用來派生新類的類爲基類,又稱爲父類。由已存在的類派生出的新類稱爲派生類,又稱爲子類。

繼承有三種繼承方式,公有繼承(public)、保護繼承(protected)、私有繼承(private)

  1. 公有繼承(public):
    公有繼承的特點是基類的公有成員和保護成員作爲派生類的成員時,它們都保持原有的狀態,而基類的私有成員仍然是私有的,不能被這個派生類的子類所訪問。
  2. 私有繼承(private):
    私有繼承的特點是基類的公有成員和保護成員都作爲派生類的私有成員,並且不能被這個派生類的子類所訪問。
  3. 保護繼承(protected):
    保護繼承的特點是基類的所有公有成員和保護成員都成爲派生類的保護成員,並且只能被它的派生類成員函數或友元訪問,基類的私有成員仍然是私有的。

下面列出三種不同的繼承方式的基類特性和派生類特性。

 	
		 public   protected   private

公有繼承  public    protected  不可見

私有繼承  private   private    不可見
 
保護繼承  protected protected  不可見

繼承格式

class Test3:public Test2
{
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章