C++基礎——類與對象(上)

面向對象四大特徵:

特徵	                  說明	                                                   類比
抽象	   抽出具體事物的普遍性的本質	     分門別類:鳥類、哺乳類、魚類
封裝    把數據與處理(函數)包在一起            通信錄(增加、刪除)
繼承    數據與處理(函數)的傳承	             財富與絕技、混血兒(膚色/頭髮、 兩種語言
多態    同一個事物(函數)的多種形態            手機鍵盤數字與字母、 電腦鍵盤功能鍵

類的定義:

與C/C++中的struct類似

class 類名{
    成員變量和成員函數的聲明;
};
PS:class定義最後要加“;”。

構成:

構成							作用
數據成員/成員變量/屬性		對象內部數據和狀態,只能在類定義中聲明,可以在成員函數中直接調用。
成員函數/方法				對象相關的操作,可以在類內實現或類外實現。

作用域運算符:

::——函數歸屬。

訪問限定符:

限定符		作用
private[默認]	私有
public		公開
protected	保護
時間中,成員變量多數情況使用private或者protected;成員函數多數情況下使用public。通常。通過成員函數改變對象的成員變量。

聲明與實現分離

頭文件(,h文件)——聲明

即將類的聲明放到頭文件中。

方式:

#pragma once
#ifnde...#endif
上面任選其一即可。
作用——防止頭文件二次編譯。

源文件(.cpp文件)——實現

即將類的實現放到源文件中。

引用頭文件:

#include <>(標準庫函數)
#include ""(自定義/第三方函數)
上面任選其一即可。

class與struct的區別:

1.默認的訪問控制不同(主要)

struct是public(共有——類外可以調用)
class是private(私有——類外不可調用)

2.初始化不同

struct可以使用花括號內的初始值列表{...}初始化,class不可以(C++98不可以,C++11可以)。

PS:

成員變量默認初始化爲隨機值(主要影響指針)。

C++的struct可以有成員函數,而C不可以。
C++的struct可以使用訪問控制關鍵字(public private protected),而C不可以。

對象的創建:

1.直接定義:

類作爲類型定義變量——棧上創建。

類名 對象1;// 調用默認構造函數
類名 對象2 = 對象1;// 調用複製構造函數
類名 對象3(對象1);// 調用複製構造函數

2.動態創建:

堆上創建。

類名* 對象指針 = new 類名;// 調用默認構造函數
delete 對象指針;


int* p = new int[10];
delete p;// 只釋放p[0]
delete [] p;// 釋放全部數組

基本類型的初始化新增語法:

int a(0);// 等價 int a = 0;
const float b(1.0);// 等價 const float b = 1.0;

注意:

空結構體與空類的大小(sizeof)爲1,主要在於初始化/實例化時,編譯器給變量/對象分配內存(地址),內存最小單位爲1個字節。通常,sizeof(類型) == sizeof(變量)。
C++除了特殊情況,很少直接使用malloc()/free()申請釋放內存,取而代之的是new/delete。

this指針

作用域——類的內部。

特點:

1.類的一個自動生成,自動隱藏的私有成員。

2.每個對象僅有一個this指針。

3.當一個對象被創建時,this指針就存放了指向對象數據的首地址。

4.不是對象本身的一部分,不會影響sizeof(對象)的結果。

5.如果成員函數形參與成員變量同名,使用this->作爲成員變量的前綴來區分。

構造函數

語法:

類名(參數){
  函數體;
};
在對象被創建時自動執行;

構造函數的函數名與類名相同;

沒有返回值類型,也沒有返回值;

可以有多個構造函數。

調用時機

1.對象直接定義創建(構造函數不能被顯式調用);

2.new動態創建。

默認構造函數

類中沒有顯式的定義任何構造函數,編譯器就會自動爲該類生成默認構造函數。

構造函數的3個作用

1.給創建的對象建立一個標識符;

2.爲對象數據成員開闢沒存空間;

3.完成對象數據成員的初始化。

初始化列表

類名(參數):成員變量(參數){
函數體;
};

作用

初始化非靜態成員變量。

說明

從概念上來說,構造函數的執行可以分成兩個階段:初始化階段和計算階段(函數體中的賦值)。初始化階段先於計算階段。

必須使用初始化列表的情況

1.常量成員,因爲常量只能初始化不能賦值,所以必須放在初始化列表裏面。
2.引用類型,引用必須在定義的時候初始化,並且不能重新賦值,所以也要寫在初始化列表裏面。
3.沒有默認構造函數的類型,因爲使用初始化列表可以不必調用默認構造函數來初始化,而是直接調用拷貝構造函數初始化。

成員變量初始化順序

成員變量在使用初始化列表初始化時,與構造函數中初始化成員列表的順序無關,只與定義成員變量的順序有關。

C++的函數可以增加默認參數。

寫法:
默認參數必須寫在函數聲明中,不能寫在函數實現的參數列表中中。
默認參數必須寫在所有非默認參數的後面。
默認參數可以寫任意多個。
使用:
默認參數可以不用傳遞值,此時,使用默認值。
默認參數可以傳值,此時,使用實參值。
代碼例子

class Complex{
public:
	Complex():real(0),imag(0){
		//this->real = 0;
		//this->imag = 0;
	}
	Complex(float real,float imag):real(real),imag(imag){
		//this->real = real;
		//this->imag = imag;
	}
	~Complex(){

	}	
	void print();
	Complex add(const Complex& other);
	Complex subtract(const Complex& other);

	Complex operator+(const Complex& other)const;
	Complex operator-(const Complex& other)const;
	friend ostream& operator<<(ostream& out,const Complex& c);
private:
	float real;
	float imag;
};

析構函數

~類名(){
  函數體
}

語法

析構函數的函數名與類名相同;

函數名前必須有一個~;

沒有參數;

沒有返回值類型和返回值;

只能有一個析構函數。

調用時機

1.對象離開作用域;

2.delete函數調用時。

默認析構函數

類中沒有顯式的定義析構函數,編譯器就會自動爲該類型生成默認析構函數。

作用

釋放對象所申請佔有的資源。

引用(別名)

聲明

const 類型名& 對象名/類型名& 對象名

使用

與對象變量,基本類型變量一樣。

作用

取代指針

引用於指針的區別

引用與指針的區別
指針指向一塊內存,它的內容是所指內存的地址;引用是某塊內存的別名。
引用只能在定義時被初始化一次,之後不可變;指針可變;
引用不能爲空,指針可以爲空;
引用使用時無需解引用*,指針需要解引用(*p);
sizeof()引用得到的是所指向的變量/對象的大小,而sizeof 指針得到的是指針本身的大小;
引用通常用於兩種情形:成員變量和函數的參數列表。

拷貝/複製構造函數

語法(3種形式)

類名(類名& 形參){ 
  函數體
}
類名(const 類名& 形參){
  函數體
}
類名(const 類名 形參){
  函數體std:swap();
}

調用時機

一個對象作爲函數參數,以值傳遞的方式傳入函數體
一個對象作爲函數返回值,以值從函數返回
一個對象用於給另外一個對象進行初始化(賦值初始化)

代碼示例

Bill::Bill(const Bill& b):name(NULL),price(b.price),count(b.count),discount(b.discount){
     name = new char[strlen(b.name)+1];
     strcpy(name,b.name);
}

默認拷貝構造函數

本質:內存拷貝
作用:複製一個已經存在的對象

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