建構函式,拷貝建構函式,析構函式,賦值函式

2021-08-29 02:21:43 字數 2615 閱讀 3334

class cgoods

else

mamount = amount;

mprice = price;

}~cgoods()        //析構函式

cgoods(const cgoods &src)              //拷貝建構函式

void operator=(const cgoods &src)      //賦值函式

private:

char *mpname;

int mamount;

double mprice;

};沒有返回值、函式名字和類名稱必須一樣

建構函式可以帶引數,因此建構函式可以過載

當沒有提供任何建構函式的時候,編譯器會給類提供預設的建構函式,函式什麼也不做,是個空函式

沒有返回值  不能帶引數  不能過載

拷貝建構函式不能按值傳遞!!!

把形參複製到實參會呼叫拷貝建構函式。如果允許拷貝建構函式傳值,就會在拷貝建構函式內呼叫拷貝建構函式,形成永無休止的遞迴呼叫從而導致棧滿溢位。只能將建構函式修改為a(const a&other),即把傳值引數改為常量引用(傳指標也不可以,只能改為引用

用物件初始化物件,預設做的拷貝方式是,按記憶體位元組拷貝過去,俗稱淺拷貝!

如果物件占用了外部的資源,那麼預設的淺拷貝一定會發生問題的!所以,當預設的淺拷貝發生問題的時候,需要使用者自己提供相應的拷貝建構函式

如果物件預設的淺拷貝發生問題,那麼有哪些解決方案?

1。提供自定義的拷貝建構函式和賦值運算子的過載函式

2。把拷貝建構函式和賦值運算子的過載函式的宣告提供在private裡面

賦值步驟:

1,先排除自賦值;2,釋放原來的資源;3,重新開闢空間,賦值

oop的迴圈佇列構造,析構,拷貝構造,賦值函式

class cqueue

cqueue(const cqueue &src)               //拷貝建構函式

}void operator=(const cqueue &src)          //賦值函式

//釋放原來的資源

delete mpqueue;

mpqueue = null;

//重新開闢空間,賦值

mfront = src.mfront;

mrear = src.mrear;

msize = src.msize;

mpqueue = new int[msize];

for (int i = mfront; i != mrear; i = (i + 1) % msize)

}~cqueue()                            //析構函式

/*cqueue queue1 ;  //queue1被初始化為queue,queue1析構後位址被釋放,queue指向變為野指標*/

/*對於物件的運算  =》   左邊物件呼叫成員方法,把右邊的物件當做引數傳入

queue2.operator=(queue1);

void operator=(const cqueue &src) */

1.物件的生成分兩步  

a.給物件分配記憶體   b.呼叫建構函式構造物件  =》 物件產生了!!!

2.如果沒有提供任何建構函式,編譯器會產生預設建構函式,空函式;但是如果使用者提供

了任意建構函式,編譯器就不再產生預設建構函式了!

3.在呼叫預設建構函式的時候,不要新增()

4.棧上的物件,先構造,後析構;後構造,先析構

5.棧上的物件,定義的時候呼叫相應的建構函式;return處,要析構棧上的所有物件

class string

else

}string(const string&other)   //拷貝建構函式

~string()                 //析構函式

string &operator = (const string &other)     //賦值函式

delete&m_data;

m_data = null;

m_data = new char[strlen(other.m_data) + 1];

strcpy(m_data, other.m_data);

}private:

char*m_data;

};int *p = new int; //分配int整形大小的空間

int *p = new int();//分配int整形大小的空間並初始化0

int *p = new int(10);//分配int整形大小的空間並初始化10

int *p = new int[10];   只開闢記憶體,10個大小為int整形的空間,不進行初始化

int *p = new int[10]();  不僅僅開闢記憶體,而且還初始化,int,陣列所有元素的初值為0

用臨時物件,拷貝構造新物件,此時臨時物件就被c++編譯器優化掉了

物件使用的三個優化規則:

1.函式引數傳遞物件,用引用傳遞,不要按值傳遞

2.如果你的函式返回的是物件的值,請返回乙個臨時物件,不要返回乙個

已經存在的物件

3.接收返回物件的函式,以初始化方式接收,不要用賦值方式接收

建構函式 拷貝建構函式 析構函式

1.如果定義了兩個預設建構函式,vc只回給出warning.2.如果有預設引數的預設構造,如果你給了第乙個預設的話 所有傳遞引數都要有預設植 否則報錯.不過如果是第乙個引數的預設值沒有給出的話,編譯器卻看不出問題,但是沒有 試過這種情況建構函式能不能正常工作.建構函式 用來初始化物件的資料成員,與類...

建構函式析構函式和拷貝建構函式

建構函式 建立類物件,並初始化其值。1.傳參 2.按照類成員宣告順序依次構造其成員 3.執行建構函式函式體 析構函式 用來完成物件被刪除前的一些清理工作 釋放類物件 1.執行析構函式函式 2.按照類中成員變數宣告順序的逆序依次析構其成員 初始化列表 初始化物件成員 呼叫成員物件的帶參構造 形式 在建...

C 建構函式 析構函式 拷貝建構函式

建構函式 析構函式 拷貝建構函式 如果類成員變數有初始值,用這些初始值初始化成員變數 如果類成員變數沒有初始值,則預設初始化該成員變數 class student int main 使用注意事項 語法 這個預設建構函式之所以對student有效,是因為我們為內建型別的資料成員提供了初始值 如果你的編...