關鍵字class
class classname
;//一定要注意後面的分號
類定義的兩種方式:
1.宣告和定義全部放在類體中,需要注意:成員函式如果在類中定義,編譯器可能會將其當成內聯函式處理。
2.宣告放在.**件中,類的定義放在.cpp檔案中。
類的訪問限定符及封裝
訪問限定符 public(公有) private(私有) protected(保護)
說明:
1.public修飾的成員在類外可以直接被訪問。
2.protected和private修飾的成員在類外不能被直接訪問(此處protected和private是類似的)。
3.訪問許可權 作用域從該訪問限定符出現的位置開始到下乙個訪問限定符出現為止。
4.class的預設訪問許可權為private,struct為public。
注意,訪問限定符只在編譯時有用,當資料對映到記憶體後,沒有任何訪問限定符上的區別。
封裝:將資料和運算元據的方法進行有機結合,隱藏物件的屬性和實現細節,僅對外公開介面來和物件進行互動。
class person
;// 這裡需要指定printpersoninfo是屬於person這個類域
void person::printpersoninfo(){}
如何計算類的大小?
//既有成員變數,又有成員函式
class a1
private:
int a;
};//只有成員函式
class a2
};//空類
class a3
{};//sizeof(a1)=4
//sizeof(a2)=1
//sizeof(a3)=1
乙個類的大小,實際就是該類中的成員變數之和,當然也要進行記憶體對齊。
空模擬較特殊,編譯器給了乙個位元組來標識這個類。
c++編譯器給每個「成員函式「增加了乙個隱藏的指標引數,讓該指標指向當前物件(函式執行時呼叫該函式的物件),在函式體中所有成員變數的操作,都是通過該指標去訪問。
只不過所有的操作對使用者是透明的,即使用者不需要來傳遞,編譯器自動完成。
指標特性
1.this指標型別:類型別* const。
2.只能在成員函式的內部使用。
3.this指標本質上其實是乙個成員函式的形參,是物件呼叫成員函式時,將物件位址作為實參傳遞給this形參。所以物件中不儲存this指標。
4.this指標是成員函式的第乙個隱含的指標形參,一般情況下通過ecx暫存器自動傳遞,不需要使用者傳遞。
建構函式
建構函式是乙個特殊的成員函式,名字與類名相同,建立型別時由編譯器自動呼叫保證每個資料成員都有乙個合適的初值,並且在物件的生命週期內只呼叫一次並不是開空間建立物件,而是初始化物件。
特性
1.函式名與類名相同。
2.無返回值。
3.物件例項化時編譯器自動呼叫對應的建構函式。
4.建構函式可以過載。
5.如果類中沒有顯示定義建構函式,則c++編譯器自動生成乙個預設建構函式,一旦顯示定義編譯器將不再生成。
6.無參的建構函式和全預設的建構函式都稱為預設建構函式。
class date
//帶參建構函式(函式體中的語句只能將其稱作為賦值,而不能被稱作初始化。初始化只初始化一次,而構造體內可以多次賦值)
date(int year, int month, int day)
//初始化列表:以乙個:為開始,以,分隔成員列表,每個『成員變數』後面放乙個括號的表示式或者初始值
date(int year, int month, int day)
:_year(_year)
, _month(month)
, _day(day)
{} //類中包含1.引用成員變數,const成員變數,類型別成員(該類沒有建構函式)
//盡量使用初始化列表初始化,對於自定義型別成員變數,一定會先使用初始化列表初始化
//成員變數的宣告次序就是初始化列表的初始化順序,與初始化列表的先後次序無關
private:
int _year;
int _month;
int _day;
};void test()
析構函式
不是完成物件的銷毀,區域性物件的銷毀工作是由編譯器完成的。
物件在銷毀時會自動呼叫析構函式,完成類的一些資源清理工作。
特性
1.析構函式名實在類名前加上字元~。
2.無引數無返回值。
3.乙個類有且只有乙個析構函式。若未顯示定義,系統會自動生成預設的析構函式。
4.物件生命週期結束時,c++編譯系統自動呼叫析構函式。
拷貝構造
拷貝建構函式:只有單個形參,該形參是對本類型別物件的引用(一般常用const修飾),在用已存在的類型別物件建立新物件時由編譯器自動呼叫。
特性
拷貝建構函式是建構函式的乙個過載形式。
拷貝建構函式的引數只有乙個且必須使用引用傳參,使用傳值方式會引發無窮遞迴呼叫。
3.若未顯示定義,系統生成預設的拷貝建構函式(對於某些是一種淺拷貝)。
運算子過載
c++為了增強**的可讀性引入了運算子過載。
函式名字為:關鍵字operator 過載的運算子符號。
函式原型:返回值型別 operator操作符(引數列表)
特性
不能通過連線其他符號來建立新的操作符:比如operator@。
.過載操作符必須有乙個類型別或者列舉型別的運算元。
用於內建型別的操作符,其含義不能改變,例如:內建的整型 + ,不 能改變其含義。
作為類成員的過載函式時,其形參看起來比運算元數目少1成員函式的。
操作符有乙個預設的形參this,限定為第乙個形參。
不能過載的運算子:.* (成員指標訪問運算子)::(域運算子)sizeof (長度運算子)? : (條件運算子)
const 成員
在成員函式後面加const
1.const修飾類的成員函式 稱為const成員函式 。
實際修飾該成員函式this指標 表明該類的成員函式不能對類的任何成員進行修改。
const物件可以呼叫其他的const函式。
非const物件可以呼叫非const成員函式和const成員函式。
const成員函式內可以呼叫其他的const 成員函式。
非const成員函式內可以呼叫其他的const成員函式和非const成員函式
static成員
靜態的成員變數一定要在類外進行初始化
特性
靜態成員為所有類物件所共享,不屬於某個具體的例項。
靜態成員變數必須在類外定義,定義時不新增static關鍵字。
類靜態成員即可用類名::靜態成員 或者 物件.靜態成員來訪問。
靜態成員函式沒有隱藏的this指標,不能訪問任何非靜態成員。
靜態成員和類的普通成員一樣,也有public、protected、private 3種訪問級別,也可以具有返回值,const修飾符等引數。
友元函式 :
友元函式可以直接訪問類的私有成員 定義在類外的普通函式,但要在類內宣告 前面加上friend關鍵字
友元函式可訪問類的私有成員,但不是類的成員函式 。
友元函式不能用const修飾 。
友元函式可以在類定義的任何地方宣告,不受類訪問限定符限制 。
乙個函式可以是多個類的友元函式 友元函式的呼叫與普通函式的呼叫和原理相同。
友元類
友元類的所有成員函式都可以是另乙個類的友元函式,都可以防問另乙個類中的非公有成員
內部類就是外部類的友元類
特性:
內部類可以定義在外部類的public、protected、private都是可以的。
注意內部類可以直接訪問外部類中的static、列舉成員,不需要外部類的物件 / 類名。
sizeof(外部類) = 外部類,和內部類沒有任何關係。
C 類與物件
程式設計模型 所有計算機均由兩種元素組成 和資料.精確的說,有些程式是圍繞著 什麼正在發生 而編寫,有些則是圍繞 誰正在受影響 而編寫的.抽象封裝 封裝是一種把 和 所操作的資料 在一起,使這兩者不受外界干擾和誤用的機制.繼承 繼承是指乙個物件從另乙個物件中獲得屬性的過程.是物件導向程式設計的三大原...
C 類與物件
c 類與物件 區分物件導向與面向過程 物件導向是指一種程式設計范型,同時也是一種程式開發的方法。它將物件作為程式的基本單元,將程式和資料封裝其中,以提高軟體的重用性 靈活性和擴充套件性。物件導向 利用物件間的訊息傳遞來驅動程式的執行。優點 真實表現客觀世界,物件間的關係清晰,物件間的訊息處理高效。面...
C 類與物件
類是物件導向的核心機制,是物件導向設計中對具有相同或相似性質的物件的抽象,是對資料和操作進行封裝的載體,進而保證了對資料的安全 高效 合理的訪問 物件是類的例項,是類的具體個體,對應現實世界的實體。類的定義 class 類名 void showclock 習慣上在類的宣告中只定義函式的原型,在類外定...