C 中的類和物件

2021-09-08 17:35:05 字數 3864 閱讀 7209

c語言與c++均是兩門非常高深及優秀的語言,二者具有類似的地方,但是相較與他們之間的區別來說呢,也就不那麼重要了,c++在c語言的基礎上增加了物件導向的程式設計模式。

物件導向:用非常接近實際領域術語的方法把系統構造成「現實世界」的物件。

類的關鍵字:class

c++的主體是以類和物件構成的,利用類來將「現實世界」中的各個物件給抽象出來。由class關鍵字以及類的名稱以及類中的成員來定義。類中可以沒有成員,也可以有多個成員 。但是沒有成員時也會占用一定的空間。

c++中的類主要包含以下幾個方面:

1、成員變數:成員變數是指乙個類的固定的屬性。

2、成員方法:成員方法可以理解為乙個類中固有屬性的行為方法。

3、訪問許可權:對類中的成員變數及成員方法的訪問許可權,分為public,private,protected三種許可權。

1) public:即公有許可權,在此許可權的作用域下,外界可以訪問該類中的成員變數及成員方法。

2) private:即私有許可權,在此許可權的作用域下,外界不可以訪問該類中的成員變數和成員方法。

3) protected:即保護許可權,外界無法直接訪問這個控制級別的成員,但是子類(派生類)可以獲得訪問父類的成員變數和成員方法的能力。

4、類的作用域:每個類都定義了自己的作用域和唯一的型別。

類的作用域包括:類的內部(花括號之內), 定義在類外部的成員函式。

在類外進行對類的成員方法進行實現時,需要加上該成員函式的作用域,即類名加上::加上函式名。在類外實現的函式需要在類內進行宣告。成員函式的返回型別不一定在類作用域中。

例:

class people

//在類外實現的函式需要在類內宣告

void walk();

private:

char* _name;

int _id;

char* _height;

char* _weigh;

};//在類外實現成員方法

void people::walk()

例如上圖**中people就是乙個類,people類中的_name,_id,_height,_weight即是類中的成員變數,eat(),walk()是類中的成員方法,piblic,private是訪問許可權,如果我們在主函式中是不允許去訪問private作用域下的成員變數的。而在public作用域下的成員方法是可以被外界呼叫的。

1、建構函式:建構函式是乙個特殊的、與類同名的成員函式,用於對該類的各個成員進行初始化。如果沒有在類中實現類的建構函式,系統會自動給乙個建構函式,但是這個建構函式什麼都不做。

2、析構函式:析構函式是對利用類來定義出的物件進行分解及所占用堆上的記憶體進行釋放的函式,在程式結束後,系統會自動去呼叫析構函式。也是很特殊的乙個函式,與類名相同,但需要在函式名前加上「~」,例如:~people(),與建構函式類似,假如沒有給出析構函式,系統也會預設給乙個析構函式,但也是什麼也不做。

注意:防止記憶體洩露

3、拷貝建構函式:拷貝建構函式,又稱複製建構函式,是一種特殊的建構函式,它由編譯器呼叫來完成一些基於同一類的其他物件的構建及初始化。其形參必須是引用,但並不限制為const,一般普遍的會加上const限制。

注意:防止淺拷貝

在c++中,下面三種物件需要呼叫拷貝建構函式:

1) 乙個物件作為函式引數,以值傳遞的方式傳入函式;

2) 乙個物件作為函式返回值,以值傳遞的方式從函式返回;

3) 乙個物件用於給另外乙個物件進行初始化(常稱為賦值初始化);

4、等號運算子的過載函式:當我們需要用到等號來對乙個物件進行複製時,就需要用到我們的等號運算子過載函式。當我們沒有自己設計等號運算子的過載函式,編譯器會自動生成乙個淺拷貝的賦值運算子的過載函式。

注意:防止自賦值   防止記憶體洩漏   防止淺拷貝

例如:

class person

//建構函式(無引數)

person()

//拷貝建構函式

person(const person& src)

//等號運算子的過載函式

person& operator=(const person& src)

//防止記憶體洩漏

if (null != _name)

delete_name;

//防止淺拷貝

_name = new char[strlen(src._name) + 1];

strcpy_s(_name, strlen(src._name) + 1, src._name);

_*** = src._***;

_age = src._age;

return *this;

} //析構函式

~person()

void eat(/*person * const this*/)

};

類既然已經被我們抽象的定義出來了,那麼類是如何去使用的,這就得用到物件了。

物件是人們要進行研究的任何事物,從最簡單的整數到複雜的飛機等均可看作物件,它不僅能表示具體的事物,還能表示抽象的規則、計畫或事件。

1、物件的例項化:通過類中的建構函式來例項化出乙個擁有類中的成員變數(固有屬性)以及成員方法的呼叫。

2、類成員方法的呼叫:通過例項化出來的物件進行對類中所實現的成員方法進行呼叫。用物件加上』.』加上函式名進行呼叫。

例:

int main()

3、this指標:乙個隱藏起來的指標,指向物件的指標,在成員方法呼叫的時候預設傳入乙個this指標,在成員方法宣告/定義的地方,預設加上this指標引數,在成員方法中使用成員變數的地方加上this->。

友元是一種定義在類外部的普通函式或類,但它需要在類體內進行說明,為了與該類的成員函式加以區別,在說明時前面加以關鍵字friend。友元不是成員函式,但是它可以訪問類中的私有成員。

友元函式:友元函式是能夠訪問類中的私有成員的非成員函式。友元函式從語法上看,它與普通函式一樣,即在定義上和呼叫上與普通函式一樣。

友元類:友元除了函式以外,還可以是類,即乙個類可以作另乙個類的友元。當乙個類作為另乙個類的友元時,這就意味著這個類的所有成員函式都是另乙個類的友元函式,都可以訪問另乙個類中的隱藏資訊(包括私有成員和保護成員)。

例如我們在乙個類中定義了乙個私有成員變數,不想讓外界訪問,但是卻又希望個別的函式或是類對我們的所定義的私有成員變數進行訪問,這個時候就可以利用友元函式和友元類進行明確的指定某個函式或某個類可以訪問這些私有變數。

class list

~node()

private:

elemtype _data;

node * _next;

//讓list變為友元類

friend class list;

};public:

list()

~list() }

node *buynode(elemtype val)

void insertelemtolist(elemtype val)

else

p->_next = s;

} }void deleteelemoflist()

else

node *q = p->_next;

p->_next = null;

delete q;

} }void showlist()

cout << endl;

}};

我們的單鏈表中有node這樣的類,但是node中的next指標域和data資料域是私有變數,不允許外界訪問,但是list類卻需要對node類中的這些私有成員進行訪問,所以給加入了友元類就可以成功的進行訪問。

C 中的類和物件

c 既是物件導向也是面向過程的語言。在這裡有乙個重要的概念 類。何謂類?類是對物件的一種抽象,舉例來講 每乙個實實在在存在的人就是乙個物件,人有很多共同的特徵 乙個頭,兩條腿,能走,能跑 這具有共同特徵的人就成為乙個類。類是乙個抽象的名詞,每乙個人 即物件 是這個類的例項。物件間具有的共同特徵是物件...

C 中的類和物件

每乙個實體都是物件。有一些物件是具有相同的結構和特性的。每個物件都屬於乙個特定的型別。在c 中物件的型別稱為類 class 類代表了某一批物件的共性和特徵。前面已說明 類是物件的抽象,而物件是類的具體例項 instance 正如同結構體型別和結構體變數的關係一樣,人們先宣告乙個結構體型別,然後用它去...

C 中的類和物件

c 中的類和物件 物件導向程式設計的基本特點 抽象,封裝,繼承和多型 1 抽象 對同一類物件的共同屬性和行為進行概括,形成類 抽象包括 資料抽象和 抽象 2 封裝 將抽象出來的資料和 封裝在一起,形成類,用class 實現封裝 類的封裝使得使用者在呼叫類的外部介面時只需要關心介面的功能即可,而不需要...