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有效,是因為我們為內建型別的資料成員提供了初始值 如果你的編...