C++語言程序設(shè)計網(wǎng)課
創(chuàng)新互聯(lián)專注于企業(yè)成都營銷網(wǎng)站建設(shè)、網(wǎng)站重做改版、邢臺縣網(wǎng)站定制設(shè)計、自適應(yīng)品牌網(wǎng)站建設(shè)、H5高端網(wǎng)站建設(shè)、商城網(wǎng)站建設(shè)、集團(tuán)公司官網(wǎng)建設(shè)、成都外貿(mào)網(wǎng)站制作、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁設(shè)計等建站業(yè)務(wù),價格優(yōu)惠性價比高,為邢臺縣等各大城市提供網(wǎng)站開發(fā)制作服務(wù)。
在對象被創(chuàng)建時使用特定的值構(gòu)造對象,將對象初始化為一個特定的初始狀態(tài)。
函數(shù)名與類名相同;不能返回值類型,不能有return語句;可以有形式參數(shù),也可以沒有形式參數(shù);可以是內(nèi)聯(lián)函數(shù);可以重載;可以帶默認(rèn)參數(shù)值;
在對象被創(chuàng)建時自動調(diào)用
調(diào)用時可以不需要實參的構(gòu)造函數(shù):
如果程序中未定義構(gòu)造函數(shù),編譯器將在需要時自動生成一個默認(rèn)構(gòu)造函數(shù)
如果類中已定義構(gòu)造函數(shù),默認(rèn)情況下編譯器就不再隱含生成默認(rèn)構(gòu)造函數(shù)
如果此時依然希望編譯器隱含生成默認(rèn)構(gòu)造函數(shù),可以使用"=default"
class Clock {
public:
Clock() = default;
Clock(int newH, int newM, int newS);
private:
int hour, minute, second;
}
類中往往有多個構(gòu)造函數(shù),只是參數(shù)表和初始化列表不同,其初始化算法都是相同的,這時,為了避免代碼重復(fù),可以使用委托構(gòu)造函數(shù)
委托構(gòu)造函數(shù)使用類的其他構(gòu)造函數(shù)執(zhí)行初始化過程:
Clock::Clock(int newH, int newM, int newS):
hour(newH),minute(newM),second(newS){
}
Clock::Clock():Clock(0,0,0){}
用一個已經(jīng)存在的對象,去初始化新的對象
復(fù)制構(gòu)造函數(shù)是一種特殊的構(gòu)造函數(shù),其形參為本類的對象引用
class 類名 {
public:
類名 (形參);//構(gòu)造函數(shù)
類名 (const 類名&對象名);//復(fù)制構(gòu)造函數(shù)
// ...
};
類名::類(const 類名&對象名) //復(fù)制構(gòu)造函數(shù)
{ 函數(shù)體 }
若不希望對象被復(fù)制構(gòu)造:
C++98做法:
將復(fù)制構(gòu)造函數(shù)聲明為private,并且不提供函數(shù)實現(xiàn)
C++11做法:
用"=delete"指示編譯器不生成默認(rèn)復(fù)雜構(gòu)造函數(shù)
class Point { //Point類的定義
public:
Point (int xx = 0, int yy = 0) {x = xx; y = yy;} //構(gòu)造函數(shù) 內(nèi)聯(lián)
Point (const Point& p) = delete; //指示編譯器不生成默認(rèn)復(fù)制構(gòu)造函數(shù)
private:
int x, y; //私有數(shù)據(jù)
};
左值:位于復(fù)制運(yùn)算左側(cè)的對象或變量
右值:位于賦值運(yùn)算右側(cè)的值
對持久存在變量的引用稱為左值引用,用&表示
對短暫存在可被移動的右值的引用稱之為右值引用,用&&表示
float n = 6;
float &lr_n = n;//左值引用
/*錯誤*/float &&rr_n = n;//錯誤,右值引用不能綁定到左值
float &&rr_n = n * n;//右值表達(dá)式綁定到右值引用
通過標(biāo)準(zhǔn)庫
float n = 10;
float &&rr_n = std::move(n);//將n轉(zhuǎn)化為右值
//使用move函數(shù)承諾除對n重新賦值或銷毀外,不以rr_n以外方式使用
基于右值引用,移動構(gòu)造函數(shù)通過移動數(shù)據(jù)方式構(gòu)造新對象,與復(fù)制構(gòu)造函數(shù)類似,移動構(gòu)造函數(shù)參數(shù)為該類對象的右值引用:
#include
class astring {
public:
std::string s;
astring (astring&& o) noexcept: s(std::move(o.s))//顯式移動所有成員
{/*函數(shù)體*/}
};
完成對象被刪除前的一些清理工作
在對象的生存期結(jié)束的時刻系統(tǒng)自動調(diào)用它,然后釋放此對象所屬的空間;如果程序中未聲明析構(gòu)函數(shù),編譯器將自動產(chǎn)生一個默認(rèn)的析構(gòu)函數(shù),其函數(shù)體為空。