建構函式和析構函式
1建構函式是什麼?
含義:建構函式:對物件初始化的時候進行初始化。
析構函式:物件生命週期結束時進行清理工作。
2什麼是初始化、賦初值?
初始化不是賦值,初始化的含義是建立變數的時候賦予其乙個初始值,而賦值的含義是把物件的當前值擦去,用乙個新值來代替
#include
using
namespace std;
intmain()
intgetx()
intgety()
private
:int x,y;};
void
main()
建構函式通常是對成員變數進行初始化
定義:類名::類名(參數列)//函式名與類名一致。
預設建構函式:
類中沒有定義建構函式,系統自動生成乙個預設建構函式
類名::類名(){} //空函式
拷貝建構函式(複製建構函式)
使用乙個已經建立完畢的物件來初始化乙個新的同型別物件。其實使用複製建構函式時都會建立乙個臨時變數,拷貝建構函式把物件放在乙個乙個臨時變數
object::object(const object &p){}
//基本格式
引數是本型別的乙個引用變數
當函式具有類型別傳值引數和返回類型別時都需要呼叫複製建構函式
(1)當乙個類作為值傳遞方式給函式引數傳值時呼叫建構函式
(2)當用實參初始化乙個形參的時候
(3)指標時只可以複製位址而不可以複製值
預設拷貝建構函式
這個執行淺拷貝***
很多時候在我們都不建立拷貝建構函式的情況下,傳遞物件給函式引數或者函式返回物件都能很好的進行,這是因為編譯器會給我們自動產生乙個拷貝建構函式,這就是「預設拷貝建構函式」
(也就是說一般情況下傳值返回物件都會自己預設建立乙個)
深複製
淺複製與深複製區別大概就是存在於指標方面,我們都知道,使用指標時複製的都是位址而不是數值,淺拷貝只是簡單的複製了一下資料成員,但一遇到堆疊問題就顯得捉襟見肘,使用淺複製時把兩個指標指向了同乙個堆空間。這就在進行析構時對這個空間進行了兩次析構產生釋放「釋放空指標」的錯誤
還有說一下,拷貝建構函式本質上還是乙個建構函式所以可以呼叫類中的任意成員。
#include
#include
using
namespace std;
struct date
class
student
box(int i=10,int j=30, int k=40)
這裡可以看做四個過載函式
建構函式的初始化列表進行初始化
與其他函式不同,建構函式除了有名字,引數列表和函式體之外,還可以有初始化列表,初始化列表以冒號開頭,後跟一系列以逗號分隔的初始化字段。另外初始化優先。
class date
為啥子使用初始化列表:
使用初始化列表少了一次呼叫預設建構函式的過程,大大的提高了執行的效率。其實列表和建構函式差不多,但是還是有必須使用引數初始化列表對資料成員進行初始化的時候
幾種情況
(1)資料成員為常量
(2)引用
(3)物件
class coord
void()
{}private:
int x,&x1;
const int x3;
這裡對資料成員進行初始化的順序依照函式宣告來規定,與初始化類表出現的順序無關。
建構函式和析構函式
建構函式沒有返回值,不能被顯示的呼叫。它是在定義物件時由系統自動執行的,而且只執行一次。如果沒有定義建構函式,系統會自動生成乙個建構函式,只是這個建構函式的函式體是空,沒有引數,也不執行任何初始化的操作。帶引數的建構函式 有一種簡練,方便的寫法 建構函式的引數初始化表 box int h,int w...
析構函式和建構函式
每個物件生成的時候都要完成物件的初始化,如設定屬性的初始值。c 中規定每個類都有乙個初始值,如果沒有,系統會產生乙個預設的建構函式。這個建構函式沒有任何引數,不做任何額外的工作。但往往我們會自己寫乙個建構函式,用來進行特殊的初始化工作。這樣的話,編譯器就不會再為其生成預設的建構函式。class 類名...
建構函式和析構函式
stock hot 因為資料部分的訪問狀態是私有的,程式不能訪問資料成員。建立stock的建構函式,由於需要為stock提供3個值,因此應為建構函式提供3個引數值,程式設計師可能指向設定company成員,而其他的設定為0 使用預設引數完成 宣告如下 stock const char co,int ...