➢建構函式是類中的特殊成員函式。
➢建構函式的作用是完成物件的初始化。
➢給出類定義時,由程式設計師編寫建構函式。如果程式設計師沒有編寫類的任何建構函式,則由系統自動新增乙個不帶引數的建構函式。
➢建構函式在類體裡的宣告形式:
類名 (形參1,形參2,···形參n) ; //也可沒有形參
➢建構函式的定義形式:
假設資料成員為x1, x2,···xn,類體外定義建構函式時通常有
3種形式:
①類名::類名(形參1,形參2, ···形參n) :x1 (形參1),x2 (形參2), xn(形參n)
②類名::類名(形參1形參2,···,形參n)
;//建立ss[0]中的物件時,用到了預設複製建構函式。
第二條語句也可以寫為如下的三條語句:
student ss[2];
ss[0] = student(stud); //呼叫預設複製建構函式
sss[1] = student();//呼叫建構函式
➢宣告和實現複製建構函式的一般格式:
class 類名
➢類只能定義乙個析構函式,且不能指明引數 ;
➢如果程式中沒有定義析構函式,則編譯器自動生成預設的析構函,數預設析構函式的函式體為空,
➢使用new運算子動態分配了記憶體空間,則在析構函式中應該使用delete釋放掉這部分占用的空間。
➢當程式先後建立幾個物件時,系統按照後建先析構的原則析構物件,當使用delete呼叫析構函式時,則按delete的順序析構。
➢析構函式在物件的生存期結束時被編譯系統自動呼叫,然後物件占用的記憶體被**。,
➢靜態變數根據變數定義的位置不同,分為靜態全域性變數和靜態區域性變數。
➢靜態全域性變數: static修飾的、 在所有花括號之外宣告的變數,其作用域範圍是全域性可見的,即在整個專案檔案內都有效。
➢靜態區域性變數: static修飾的、 塊內定義的變數,其作用域從定義之處開始到本塊結束處為止。
➢靜態變數均儲存在全域性資料區,靜態區域性變數只執行一次初始化。如果靜態變數未初始化,則系統將其初始化為0。
➢類的靜態成員有兩種:靜態成員變數和靜態成員函式。
➢定義靜態成員:在類體內定義成員時,在前面加上static。
➢靜態成員變數不能在類體內賦值。給靜態成員變數賦初值的格式
如下:型別 類名::靜態成員變數=初值; //不能有static
➢在類體外定義成員函式時,前面也不能加static。
➢類的靜態成員被類的所有物件共享。
➢靜態函式與靜態函式之間、非靜態函式與非靜態函式之間是可以相互呼叫的,非靜態成員函式內可以呼叫靜態成員函式,但靜態成員函式內不能呼叫非靜態成員函式。
➢訪問類靜態成員的一般格式如下:
類名::靜態成員名
物件名靜態成員名
物件指標->靜態成員名
(1)可以不指向某個具體的物件,只與類名連用;
(2)在沒有建立物件之前,靜態成員就已存在;
(3)靜態成員是類的成員,不是物件的成員;
(4)靜態成員為該類的所有物件共享,它們被儲存於乙個公用記憶體中;
(5)沒有this指標,只能通過物件名或指向物件的指標訪問類的資料成員;
(6)靜態成員函式不能被說明為虛函式;
(7)靜態成員函式不能直接訪問非靜態函式
(1)靜態物件的建構函式在**執行過程中,在第一次遇到它的變數定義並初始化時被呼叫,但直到整個程式結束之前僅呼叫一次;而普通物件則是遇到變數定義就被呼叫,遇到幾次呼叫幾次。
(2)靜態物件的析構函式在整個程式退出之前被呼叫,同樣也只呼叫一次;而普通物件則是變數被定義幾次,則析構幾次。
➢變數的生存期:是指變數所佔據的記憶體空間由分配到釋放的時期。
➢變數的作用域:變數有效的範圍。
➢全域性變數:是程式中定義在所有函式之外的變數。其作用域是程式從變數定義到整個程式結束的部分;其生存期為整個程式的執行期間。
➢區域性變數:在函式內或程式塊內說明的變數。其作用域是函式體內或程式塊內(一-對大括號括起來的程式段)其生存期為從被說明處開始,到所在函式或程式塊結束處結束。
➢類的物件在生成時呼叫建構函式,在消亡時呼叫析構函式,在這兩個函式呼叫之間即是物件的生存期。
➢類的物件的作用域和變數的作用域含義一-致。
1、類常量成員變數
➢類常量成員變數:由關鍵字const修飾的類成員變數。
➢定義類常量成員變數的一般格式如下:
const
資料型別 類常量成員變數 = 表示式;
➢類常量成員變數必須進行初始化,而且只能通過建構函式的成員初始化列表的方式進行。
2、常量物件
➢常量物件:使用const宣告的物件就是常物件
➢常量物件必須在宣告的同時進行初始化,而且不能被更新。
定義常量物件的一般格式:
const類名物件名(參數列) ; 或
類名const物件名(參數列) ;
例: mydate const al(1997,12,20); //定義mydate類常量物件al並初始化
➢常量物件只能呼叫常量成員函式,不能呼叫非常量函式,普通物件可以呼叫所有成員函式
3、常量函式
➢常量函式:用const宣告、 定義的成員函式。
➢常量函式的宣告及定義形式為:
(1)在類體內定義常量函式為內聯函式時的形式: 型別識別符號 函式名 (引數列表) const
(2)在類體內宣告,類體外定義時的形式
宣告形式:型別識別符號 函式名 (引數列表) const;
定義形式:型別識別符號 類名::函式名 (引數列表) const
➢常量函式不能更新物件的資料成員,也不能呼叫該類中沒有用const修飾的成員函式。
4、常引用作為函式的引數
使用引用作為函式引數,傳送的是位址,所以形參改變,則實參也跟著改變,但如果不希望函式改變物件的值,就要使用常引用作為引數,
例如: void display(const double& r)
例: student::student(string n);:name(n), birthday(mydate(){}
➢執行封閉類的建構函式時,先執行成員物件的建構函式,然後再執行本類的建構函式。
➢封閉類物件生成時,先執行所有成員物件的建構函式,然後執行封閉類自己的建構函式。
➢成員物件建構函式的執行次序與成員物件在類定義中的說明次序一致,與它們在建構函式初始化列表**現的次序無關。
➢當封閉類物件消亡時,先執行封閉類的析構函式,然後再執行成員物件的析構函式,成員物件析構函式的執行次序和建構函式的執行次序相反,即先構造的後析構
➢友元是為了兼顧c語言程式設計的習慣與c++資訊隱藏的特點,而特意增加的功能。
➢友元機制是對一-些類外的函式開啟的乙個特殊通道,授權它們能夠訪問本類的私有成員變數。
➢友元的概念破壞了類的封裝性和資訊隱藏,但有助於資料共享,能夠提高程式執行的效率。
➢友元機制包括友元函式和友元類。
➢友元函式:在定義乙個類的時候,可以把一些函式(」包括全域性函式和其他類的成員函式)宣告為「友元「,這樣那些函式就成為本類的友元函式。
➢在類定義中宣告友元函式形式:
friend函式型別函式名(引數列表) ; //針對全域性函式
friend函式型別函式所在類名::函式名(引數列表) ;
➢友元函式可在類中的私有或公有部分通過關鍵字friend宣告或定義,但如在類中宣告,而在類外定義,就不能再在類外使用friend關鍵字。
➢友元函式應被看作類的介面的一部分,使用它的主要目的是提高效率,因為它可以直接訪問物件的私有成
員,從而省去呼叫類的相應成員函式的開銷。
➢友元函式的另一乙個優點是:類的設計者不必在考慮好該類的各種可能使用情況之後再設計這個類,
而是可以根據需要,通過使用友元來增加類的介面。
➢如果將乙個類b說明為另乙個類a的友元類,則類b中的所有函式都是類a的友元函式。
➢在類定義中宣告友元類的格式如下:
friend class類名;
➢友元類的關係是單向的。若說明類b是類a的友元類,不等於類a也是類b的友元類。友元類的關係不能傳遞,即若類b是類a的友元類,而類c是類b的友元類,不等於類c是類a的友元類。
➢除非確有必要,一般不把整個類說明為友元類,而僅把類中的某些成員函式說明為友元函式。
➢c++規定,當乙個成員函式被呼叫時,系統將自動向它傳遞乙個隱含的引數,該引數是乙個指向呼叫該函式的物件的指標,名為this指標,從而使成員函式知道該對哪個物件進行操作。
➢使用this指標,保證了每個物件可以擁有自己的資料成員,但處理這些資料成員的**卻可以被所有的物件共享,從而提高了程式的安全性和效率。
➢this指標 是c+ +實現封裝的一種機制,它將物件和該物件呼叫的成員函式連線在-起,從而在外部看來,每個物件都擁有自己的成員函式。
➢this指標指向的是成員函式作用的物件,也就是呼叫成員函式的物件。友元函式不通過物件呼叫,所以沒有this指標。
➢靜態成員是類具有的屬性,不是物件的特徵,this表示的是隱藏的物件的指標,所以靜態成員函式沒有this指
針。
Python 類和物件(高階一)
python的描述符就是乙個類,只不過這個類描述了類中的屬性和方法,這裡不做過多的介紹。大家知道,我們既可以聽過類名.屬性的方式修改類的屬性,也可以通過物件名.屬性的方式修改類的屬性,但是考慮到python中使用類的主要是為了封裝的作用,而由於類名.屬性容易破壞類的封裝,因此為了使用類名.屬性的方式...
物件導向 高階
json方式的物件導向 json 把方法包在json裡 json物件導向 有人管他叫 命名空間 在公司裡 把同一類 的方法包在一起 拖拽和繼承 物件導向的拖拽 改寫原有的拖拽 繼承 asdf 拖拽 instanceof 檢視物件是某個類的例項 使用繼承 限制範圍的拖拽類 建構函式的偽裝 屬性的繼承 ...
物件導向高階
public class person public void print public class student extends person 重寫了父類方法 public void print public class demo public class demo 1.不能new這個類,只能靠...