C++語法細微(三)(面向對象和類)

/*
//2009年10月28日14:40

面向對象的思想和技術:
對象(Object):客觀世界中的任何事物都可以看做是一個對象
封裝(Encapsulation):將一些數據和操作代碼封裝在一個對象中,形成一個基本單位,各個對象之間相互獨立,互不干擾。
信息隱蔽(Information hiding)
抽象(Abstraction):抽象表示了一類事物的本質
繼承與重用(software reusability)
多態性(Polymorphism)

面向對象分析(Object oriented analysis OOA)
面向對象設計(Object oriented design OOD)
面向對象編程(Object oriented programing OOP)
面向對象測試(Object oriented test OOT)
面向對象維護(Object oriented soft Maintenance OOSM)

類的聲明:
class 類名
{
public:
公用的數據和成員函數;
private:
私有的數據和成員函數;
};
public , private (成員訪問限定符 member access specifier)
如果沒有限定說明 默認爲private。
struct 和 class 的區別在struct的成員默認public,而class默認private。

類的成員函數在類外定義:
functionReturnType className::functionName(… …)

inline成員函數:
在類體中定義成員不包括不包括循環等控制結構 C++自動將其作爲內置函數處理,所以可以不必進行顯示的inline聲明。
類外定義的函數系統不會默認將其作爲內置函數,如果要將其內置則必須顯示聲明inline。

對象的存儲中 數據和操作分開

對象成員的訪問:對象名.成員名; 指針名->成員名; (*指針名).成員名;
引用訪問:
Time t1;
Time &t2 = t1;
cout<<t2.hour;

類的公有接口和私有實現的分離 形成了信息隱蔽
當接口與實現(對數據的操作)分離時,只要類的接口沒有改變,對私有實現的修改不會影響程序的其他部分。

類聲明文件就成爲用戶使用類的公用接口,包含函數定義的文件就是類的實現。

類和對象的進一步討論:
構造函數(constructor):
和類名相同,在建立對象時自動執行,沒有類型,不返回任何值
構造函數名(類型1 形參1,類型2 形參2,……)
參數初始化表:
Box::Box(int h,int w,int len):height(h),width(w),length(len){}

有帶有默認參數的構造函數後,不能進行構造函數的重載,不能有不帶參數的構造函數。
析構函數(destructor):
作用與構造函數相反,名稱是類名前面加一個'~';
當對象的生命週期結束時,會自動執行析構函數。
析構函數並不是刪除對象,而是在撤銷對象佔用的內存之前完成一些清理工作,析構函數不返回任何值,沒有函數類型,沒有函數參數,不能重載,一個函數中能有一個析構函數。 可以用來執行用戶希望在最後一次適用對象之後所執行的操作。
構造函數和析構函數的調用順序:
先構造的後析構,後構造的先析構,相當於一個棧,先進後出。

對象數組
Student stud[50];
Student stud[3] = {60,70,80};
編譯系統只對每個對象傳遞一個實參
Student stud[3] = { Student(1001,87,18),Student(1002,90,20),Student(1003,89,21)};

對象指針:對象空間的起始地址就是對象的指針
類名 *對象指針名;
指向對象成員的指針:
數據類型名 *指針變量名;
指向對象成員函數的指針:
(1)函數參數的類型和參數個數(2)函數返回值的類型(3)所屬的類
函數返回值類型 (類名::*指針變量名)(參數列表);
指針變量名 = &類名::成員函數名

this指針:
在每一個成員函數中都包含一個特殊的指針,這個指針的名字是固定的 稱爲this
this指針是隱式使用的 它是作爲參數傳遞給成員函數的

常對象:
凡希望數據成員不被修改的對象,可以聲明爲常對象:
const className objectName [(實參表列)];
className const objectName [(實參表列)];
常對象不能掉用該對象的非const型的成員函數
void getTime() const; //聲明函數爲const
mutable int count; //可以修改count的值
常數據成員:只能通過構造函數的參數初始化表對常數據成員進行初始化。
常對象的數據成員都是常數據成員。
常成員函數,只能引用本類中的數據成員,而不能修改它們。
——————————————————————————————
數據成員             | 非const成員函數   | const成員函數
——————————————————————————————
非const數據成員 | 可以引用可改變     | 可以引用不可改變
——————————————————————————————
const數據成員     | 可引用不可改變     | 可以引用不可改變
——————————————————————————————
const對象數據成員| 不允許                 | 可以引用不可改變
——————————————————————————————

指向對象的常指針:
類名 * const 指針變量名;
(指向對象的常指針變量的值不能改變 即始終指向同一個對象 但是可以修改其所指向對象的值)

指向常對象的指針變量:
const 類型名 * 指針變量名;
(1):如果一個變量已經聲明爲常變量 只能用指向常變量的指針指向它
(2):指向常變量的指針除了可以指向常變量外 還可以指向未被聲明爲const的變量 只是不能通過指針變量改變該變量的值
(3):如果函數的形參是指向非const型變量的指針 實參只能用指向非const變量的指針 而不能用指向const變量的指針
當希望在調用函數時對象的值不被修改 就應當把形參定義爲指向常對象的指針變量 同時用對象的地址作爲實參,如果要求帶對象不僅在調用函數的過程中不被改變,而且要求它在程序執行過程中都不改變 則應該把它定義爲const型
const小結:
———————————————————————————————————————————————
形式                             │               含義
———————————————————————————————————————————————
Time const t1;              │ t1是常對象 其值在任何情況下都不能改變
———————————————————————————————————————————————
void Time::fun() const   │ fun是Time類中的常成員函數 可以引用 但不能修改本類中的數據成員
———————————————————————————————————————————————
Time * const p;            │ p是指向對象的常指針,p的值(即p的指向)不能改變
———————————————————————————————————————————————
const Time *p;               │ p是指向Time類常對象的指針,其指向的類對象的值不能通過指針來修改
———————————————————————————————————————————————
Time &t1 = t1;          │t2是Time類對象t1的引用,二者指向同一段內存空間
——————————————————————————————————————————————————

對象的動態建立與釋放
可以用new動態建立對象 用delete刪除
Box *pt;
pt = new Box;
OR:
Box *pt = new Box(12,15,18);

cout<<pt->height;
cout<<pt->vloume();

delete pt;

對象的賦值和複製:
已經多'='進行了重載 所以兩個對象之間(同類對象)可以直接進行賦值(對象裏面成員數據的值)
對象名1 = 對象名2;

對象的複製:
ClassName objectName2(objectName2);
調用複製構造函數

靜態數據成員
class ClassName
{
public:
static int tempExample;
private:
int xx;
};
int ClassName::tempExample = 10;
靜態成員函數
靜態成員函數沒有this指針 如果要引用非靜態成員變量 當需指明對象
用類名來引用靜態成員的時候用::
C++

友元
友元函數可以訪問一個類的私有成員 只需在類中聲明一下
friend functionReturnType FunctionName(……);
friend functionReturnType ClassName::FunctionName(……);
類的提前引用 提前聲明:
class ClassName;
一個函數(包括普通函數和成員函數)可以被多個類聲明爲朋友,這樣就可以訪問對各類中的私有數據
友元類
friend ClassName;
關係單向 不能傳遞

類模板:
類模板是類的抽象 類是類模板的實例
template<class numType>
ClassName <int> objectName(1,1);
在類外定義成員函數:
template<class typeName>
typeName ClassName<typeName>::functionName(……){……}
template<class 虛擬類型函數>
定義對象:
類模板名<實際類型名> 對象名;
類模板名<實際類型名> 對象名(實參表列);
定義函數:
template<class 虛擬類型參數>
functionReturnType ClassName<虛擬參數類型>::成員函數名(函數形參表列){……}

*/

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