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