C++面向对象笔记:构造、析构函数、成员函数
構(gòu)造函數(shù):用以對類中數(shù)據(jù)成員進行初始化
系統(tǒng)會自動生成默認構(gòu)造函數(shù)(參數(shù)為空),但是若手動定義了帶參的構(gòu)造函數(shù),會自動覆蓋默認構(gòu)造函數(shù)時若需要調(diào)用默認構(gòu)造函數(shù)進行實例化,需要手動定義一個不帶參的構(gòu)造函數(shù)
初始化列表:可通過初始化列表的方式對類數(shù)據(jù)成員進行初始化,如定義初始化列表:User():sId(0001),sSex(1)
繼承基類時在派生類中調(diào)用基類的構(gòu)造函數(shù),對基類進行初始化,實際上就是初始化列表。
構(gòu)造函數(shù)可以只在類體內(nèi)聲明,在類體外定義,且聲明時不需要初始化列表,在定義時需要給出初始化列表(若有)。
有兩種情況需要初始化列表:
因為構(gòu)造函數(shù)的執(zhí)行順序如下:
常量成員不能放在構(gòu)造函數(shù)中:常量成員聲明后無法修改,只能放在初始化列表中;
子對象:定義類對象首先要分配內(nèi)存,如果包含另外的類對象,也需要為其分配內(nèi)存,所以另外的類對象初始化要先于構(gòu)造函數(shù)執(zhí)行;
類的數(shù)據(jù)成員與成員函數(shù)是分開存放的,數(shù)據(jù)成員存放堆棧區(qū),成員函數(shù)存放在代碼區(qū),成員函數(shù)通過this指針訪問其自身對象
靜態(tài)成員:
靜態(tài)成員存放在靜態(tài)全局區(qū),與類實際上沒有太大的關(guān)系。靜態(tài)成員生存期為整個程序運行期,進程結(jié)束才釋放!
靜態(tài)成員需要在類體外定義(已在構(gòu)造函數(shù)中初始化)或者初始化才能使用。
靜態(tài)與非靜態(tài)的相互訪問:
經(jīng)測試,構(gòu)造函數(shù)也可以初始化靜態(tài)成員,當然,其他的成員函數(shù)也可以操作靜態(tài)成會員。
但是靜態(tài)成員函數(shù)要想訪問非靜態(tài)成員,需要特殊處理:傳遞具體的類對象給靜態(tài)成員函數(shù),再通過該類對象訪問非靜態(tài)成員。
常成員函數(shù):若一個成員函數(shù)用const修飾,則不允許修改內(nèi)部成員,相當于對內(nèi)部this指針加了const修飾,不能通過this->id = ...修改值。
?析構(gòu)函數(shù):析構(gòu)函數(shù)的作用并不是刪除對象,而是在撤銷對象占用的內(nèi)存空間前進行一些清理工作。
系統(tǒng)會自動生成函數(shù)體為空的析構(gòu)函數(shù)。
用途:在有內(nèi)部指針的時候就要使用析構(gòu)函數(shù)防止內(nèi)存泄漏。
對于一般對象,如User user;出作用域時會自動執(zhí)行析構(gòu)函數(shù)
但對于動態(tài)分配的對象:User user = new user;即使出了作用域,也不會自動執(zhí)行析構(gòu)函數(shù),必須手動進行delete user,才能調(diào)用析構(gòu)函數(shù)。
static局部對象在函數(shù)調(diào)用結(jié)束時并不釋放,也不調(diào)用析構(gòu)函數(shù)。只有在main函數(shù)結(jié)束或執(zhí)行exit語句,才調(diào)用static對象析構(gòu)函數(shù)
析構(gòu)函數(shù)同樣可以定義在類體外,函數(shù)聲明在類體內(nèi)部;
析構(gòu)函數(shù)執(zhí)行順序:
對于同類型對象,先構(gòu)造的后析構(gòu),后構(gòu)造的先析構(gòu)。
原因:因為對象是存在于堆棧中,先進后出。
1 class CMyClass 2 { 3 public: 4 CMyClass():iNo(0) 5 {} 6 CMyClass(int i):iNo(i) 7 { 8 this->iId = i; 9 CMyClass(); 10 } 11 public: 12 int iId; 13 const int iNo; 14 };?
構(gòu)造函數(shù):在建立對象時自動執(zhí)行構(gòu)造函數(shù)
CMyClass myObject; //自動執(zhí)行構(gòu)造函數(shù)
有參構(gòu)造函數(shù):
CMyClass myObject(1);//自動執(zhí)行構(gòu)造函數(shù)
一個構(gòu)造函數(shù)中也可以手動調(diào)用另一個構(gòu)造函數(shù),但是若被調(diào)用的構(gòu)造函數(shù)聲明時帶有初始化參數(shù)列表,但是參數(shù)初始化列表此時不會執(zhí)行
只有系統(tǒng)自動調(diào)用時才會執(zhí)行參數(shù)初始化列表
如上例,在CMyClass(int i) 中調(diào)用MyClass(),不會執(zhí)行初始化列表iNo(0);
調(diào)用構(gòu)造函數(shù)和析構(gòu)函數(shù)的順序:
1、全局對象:構(gòu)造函數(shù)在文件中的所有函數(shù)執(zhí)行之前調(diào)用,main函數(shù)執(zhí)行完畢或調(diào)用exit時執(zhí)行析構(gòu)函數(shù)
2、靜態(tài)局部:在程序中第一此調(diào)用此靜態(tài)局部對象所在的函數(shù)時調(diào)用構(gòu)造函數(shù)一次,調(diào)用結(jié)束后并不釋放,main函數(shù)執(zhí)行完畢或調(diào)用exit時執(zhí)行析構(gòu)函數(shù)
3、局部自動對象:在建立對象時調(diào)用其構(gòu)造函數(shù),其所在函數(shù)執(zhí)行完畢對象釋放時,調(diào)用其析構(gòu)函數(shù)
?
轉(zhuǎn)載于:https://www.cnblogs.com/jiese/archive/2012/07/03/2574090.html
總結(jié)
以上是生活随笔為你收集整理的C++面向对象笔记:构造、析构函数、成员函数的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: android Listview2 笔记
- 下一篇: HIS系统两种收费模式比较:前计费和后计