類的宣告和定義
c++中類的定義一般分為類的宣告部分和類的實現部分。類的宣告部分用來說明該類中的成員(資料成員,成員函式),告訴使用者「幹什麼」。類的實現部分用來定義成員函式,該函式用來對資料成員進行操作,告訴使用者「怎麼做」。
類定義的形式:
class
《類名》
: //類的宣告部分
《各成員函式的實現》 //類的實現部分
實現乙個簡單的類:
class student //類名
;
類的三大特性:封裝,繼承,多型
函式是封裝的一種形式:函式所執行的細節行為被封裝在函式本身這個更大的實體中,被封裝的元素隱藏了他們的實現細節—可以呼叫乙個函式但是不能夠訪問函式所執行的語句。
封裝:隱藏物件的屬性和實現細節,僅對外公開介面和物件進行互動,將資料和運算元據的方法進行有機結合。
類成員有以下3種不同的訪問限定符
(1)公有成員訪問限定符(public):既可以被本類中的成員函式訪問,也可以被類的作用域內的其他函式訪問。
(2)私有成員訪問限定符(private):成員只能被該類中的成員函式訪問,類外的其他函式則不能(友元類除外)
(3)保護成員訪問限定符(protected):成員只能被該類的成員函式或派生類的成員函式訪問。
如果在類的定義中既不指定private,也不指定public,則系統預設是私有的。在乙個類體中,public和pirvate可以分別出現多次,既在乙個類體中可以包含多次,每個部分的作用範圍到出現另外乙個成員訪問限定符或者類體的結束為止。
class date
void display()
private:
int _year;
int _month;
int _day;
};int main()
類的例項化
物件是類的例項,類就像以一張圖紙,而物件才是按照圖紙建造的房子。
date d;//例項化出物件d
建構函式
c++定義了一種特殊的初始化函式,叫做建構函式。當物件建立時,建構函式自動被呼叫
例子:
class date
void display()
private:
int _year;
int _month;
int _day;
};int main()
結果:
我們看到,當物件d建立後系統自動呼叫了建構函式。
【特徵】:
1,函式名和類名相同
2,無返回值
3,物件構造時系統自動呼叫
4,可以再類內/類外定義。
5,當沒有顯式定義建構函式時,系統會自動生成乙個預設的建構函式!
6,無參的建構函式,和全預設的建構函式都認為是預設的建構函式,並且預設的建構函式只能有乙個。
拷貝建構函式
拷貝建構函式是建構函式的過載,只有單個形參,而且該形參是對本類型別物件的引用(常用const修飾),這樣的建構函式稱為拷貝建構函式。拷貝建構函式是特殊的建構函式,建立物件時使用已存在的同類物件來進行初始化,由編譯器自動呼叫。
例子:
class date
date(const date& d )
void setdate(int year = 1900, int month = 1, int day = 1)
void display()
private:
int _year;
int _month;
int _day;
};int main()
結果:
【特徵】:
1,建立物件時使用同類物件進行初始化
2,必須使用引用傳參
3,若未顯示定義,系統就會預設生成,會依次拷貝類的資料成員完成初始化。
【使用場景】
1——物件例項化物件
date d1(2017, 6, 25);
date d2(d1);
2——傳值方式作為函式的引數
void funtest(const
date date)
{}
3——傳值方式作為函式返回值
date fun()
析構函式
析構函式與建構函式相反,是在物件被刪除前由系統自動呼叫執行它做清理工作。例如,在建立物件是用new分配的記憶體空間,應在析構函式中用delete釋放。析構函式也與類同名,但在名字前面有乙個「~」符號,析構函式沒有返回值和返回型別。
例子:
class array
~array() //析構函式
_size = 0;
_capacity = 0;
} private:
int* _pdata;
size_t _size;
size_t _capacity;
};
【特徵】:
1,在類名前加「~」
2,無參,無返回值
3,若未顯式定義,系統會ui自動預設生成
4,物件生命週期到了,系統預設生成
5,並不是刪除物件,而是做清理工作
運算子過載
在c++中,可以用關鍵字operator加上運算子來表示乙個數,
就是運算子過載就是對已有的運算子重新進行定義,賦予其另一種功能,以適應不同的資料型別。下面兩個複數相加的函式為例進行介紹。假定定義了複數類complex,則有:
complex addition(complex a,complex b)
可以用運算子過載來表示:
complex operator+(complex a,complex b)
這樣就可以寫成a+b的形式了。
不能過載的運算子:
【運算子過載為類的成員函式的一般語法形式為:】
函式型別 operator 運算子(形參表)
【運算子過載規則如下:】
①、 c++中的運算子除了少數幾個之外,全部可以過載,而且只能過載c++中已有的運算子。
②、 過載之後運算子的優先順序和結合性都不會改變。
③、 運算子過載是針對新型別資料的實際需要,對原有運算子進行適當的改造。一般來說,過載的功能應當與原有功能相類似,不能改變原運算子的操作物件個數,同時至少要有乙個操作物件是自定義型別。過載為類的成員函式和過載為類的友元函式。
this指標
this指標是乙個自動生成,自動隱藏的私有成員,它存在類的非靜態成員函式中,他指向被呼叫函式所在的物件。全域性只有乙個this指標,當乙個物件被建立時,this指標就存放指向物件資料的首位址!
乙個物件的this指標並不是物件本身的一部分,不會影響sizeof(物件)的結果。this作用域是在類內部,當在類的非靜態成員函式中訪問類的非靜態成員的時候,編譯器會自動將物件本身的位址作為乙個隱含引數傳遞給函式。也就是說,即使你沒有寫上this指標,編譯器在編譯的時候也是加上this的,它作為非靜態成員函式的隱含形參,對各成員的訪問均通過this進行。
例如,呼叫date.setmonth(9) <===> setmonth(&date, 9),this幫助完成了這一轉換 .
【使用】
一種情況就是,在類的非靜態成員函式中返回類物件本身的時候,直接使用 return *this;另外一種情況是當引數與成員變數名相同時使用this指標,如this->n = n (不能寫成n = n)。
類和物件 四個預設成員函式 運算子過載
類的定義 類 class 實際上是某種型別的物件變數和方法的原型.類是從一些具有相同屬性或功能的具體例項中抽象出共有的一些屬性。類是乙個新的資料型別,它和結構體有點相似,是由不同資料型別組成的集合體,但類要比結構體增加了運算元據的行為,這個行為就是函式,還有乙個區別就是類內存在類成員訪問的修飾限定符...
C 類和物件1 四個預設成員函式 運算子過載
1 整理類和物件的基礎知識,如類的定義,訪問限定符,物件導向封裝性,物件的大小計算等等。2 整理四個預設成員函式及運算子過載相關知識 3 整理隱含的this指標等等,及對運算子過載背後做的事情。c 不是純物件導向語言,而是基於物件導向的語言 三種訪問限定符 public成員可以從類外部直接訪問,pr...
C 四個預設成員函式 運算子過載
1 1 類的定義 在c 中,用 類 描述 物件 所謂的物件是指現實世界中的一切事物。類是建立物件的模板,乙個類可以建立多個物件,每個物件都是類的乙個具體 例項,擁有類的成員變數和成員函式。乙個簡單的類定義 class student 2 訪問限定符 宣告了對類的外部介面,所有來自外部的訪問通過介面進...