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