c語言是面向過程的,關注的是過程,分析出求解問題的步驟,通過函式呼叫逐步解決問題。根據的我理解:c++中的類就是把c語言中的函式和變數封裝到了一起,需要使用的時候,建立乙個物件根據需求去使用各個介面(介面就是類中的函式)就行。c++是基於物件導向的,關注的是物件,將一件事情拆分成不同的物件,靠物件之間的互動完成。
在c語言中,結構體只能定義變數;可是在c++中結構體既可以定義變數又可以定義函式。
typedef
struct student
void
printstudentinfo()
private
:char _name[20]
;char _***[6]
;short _age;
} student;
這裡有乙個小知識點:在結構體中如果不寫訪問限定符,結構體預設是public;但是在c++中,更喜歡用類(class)來替代結構體(struct)。可是在類中,如果不寫訪問限定符,預設是private。
class
classname
;//這裡一定要加分號
類的兩種定義方式:
宣告和定義全部放在類體中,需要注意:成員函式如果在類中定義,編譯器可能會將其當成內聯函式處理。
class student
private:
char _name[20];
char _***[6];
int _age;
};
宣告放在.**件中,類的定義放在.cpp檔案中
class
person
;#include
"person.h"
void person::
showinfo()
3.1訪問限定符
c++實現封裝的方式:用類將物件的屬性與方法結合在一塊,讓物件更加完善,通過訪問許可權選擇性的將其介面提供給外部的使用者使用。
在提一下上面提過的小知識點:
在結構體中如果不寫訪問限定符,結構體預設是public;
可是在類中,如果不寫訪問限定符,預設是private。在這裡說明一下各個訪問限定符:
public修飾的成員在類外可以直接訪問。
protected 和 private修飾的成員在類外不能直接被訪問。
訪問許可權作用域從該訪問限定符出現的位置開始直到下乙個訪問限定符出現時為止。
class的預設訪問許可權為private,struct為public。(因為struct要相容c語言)
3.2 封裝
物件導向的三大特性:封裝、繼承、多型
封裝:將資料和運算元據的方法進行結合,隱藏物件的屬性和實現細節(這裡用類的定義的第二種方法來實現隱藏實現細節),僅對外公開介面來和物件進行互動。
類定義了乙個新的作用域,類的所有成員都在類的作用域中。在類體外定義成員,需要使用::作用域解析符指明成員屬於哪個類域。
就像上面的類的第二種定義方式一樣。
class
person
;#include
"person.h"
void person::
showinfo()
5.1 如可計算類物件模型
類物件模型的大小是不算類成員函式的。因為不管類有多少個物件,成員函式是一樣的,所以可以編譯器把成員函式存放在**段。
其次,類物件模型的大小遵循記憶體對齊規則。
讓我們來複習一下結構體的記憶體對齊規則:
第乙個成員在與結構體偏移量為0的位址處。
結構體總大小為:最大對齊數(所有變數型別最大者與預設對齊引數取最小)的整數倍。
如果巢狀了結構體的情況,巢狀的結構體對齊到自己的最大對齊數的整數倍處,結構體的整體大小就是所有最大對齊數(含巢狀結構體的對齊數)的整數倍。
若還不清楚,可以看我之前寫過的記憶體對齊篇。c++編譯器給每個「成員函式」增加了乙個隱藏的指標引數,讓該指標指向當前物件(函式執行時呼叫該函式的物件),在函式體中所有成員變數的操作,都是通過該指標去訪問。只不過所有的操作對使用者是透明的,即使用者不需要來傳遞,編譯器自動完成。
也就是說,在類中的成員函式中,this指標作為形參的第乙個引數被隱藏起來,使用者在寫**的時候可以直接用。舉個栗子:
class
date
void
setdate
(int year,
int month,
int day)
private
:int _year;
// 年
int _month;
// 月
int _day;
// 日};
intmain()
在這個date類中,setdata函式中,對變數賦值的時候,其實是有this指標的指向,只不過編譯器將其省略了。
this指標的特性:
this指標的型別:類型別* const
只能在「成員函式」的內部使用
this指標本質上其實是乙個成員函式的形參,是物件呼叫成員函式時,將物件位址作為實參傳遞給this形參。所以物件中不儲存this指標。
this指標是成員函式第乙個隱含的指標形參,一般情況由編譯器通過ecx暫存器自動傳遞,不需要使用者傳遞
若this指標為空,就不可以在訪問成員變數了。
C 類和物件 物件的初始化和清理
4.2.1 建構函式和析構函式 物件的初始化和清理也是兩個非常重要的安全問題 乙個物件或者變數沒有初始狀態,對其使用後果是未知 同樣的使用完乙個物件或變數,沒有及時清理,也會造成一定的安全問題 c 利用了建構函式和析構函式解決上述問題,這兩個函式將會被編譯器自動呼叫,完成物件初始化和清理工作。物件的...
物件導向之初始類和物件
類專業解釋為 類指的是一類具有相同屬性和方法的事物的集合。物件的專業解釋為 類的例項化為物件 所以,需要先定義類,再通過例項化類得到物件 在python中一切皆是物件 類的定義 class student object stu school hnie count 0 def init self,na...
類和物件 初始化
一般的訪問許可權修飾符 public protected private 預設,對class修飾一般用public 預設,乙個原始檔中只能有乙個public修飾的類,static 靜態的,static修飾的變數成為靜態變數,是共享的,和static修飾的同名的變數,無論哪乙個改變,其他的也會改變,一...