真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

C++基礎(chǔ)02-構(gòu)造函數(shù)-類與對象

類與對象-構(gòu)造函數(shù) | C++基礎(chǔ)

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ù)。

構(gòu)造函數(shù)

在對象被創(chuàng)建時使用特定的值構(gòu)造對象,將對象初始化為一個特定的初始狀態(tài)。

構(gòu)造函數(shù)形式

函數(shù)名與類名相同;不能返回值類型,不能有return語句;可以有形式參數(shù),也可以沒有形式參數(shù);可以是內(nèi)聯(lián)函數(shù);可以重載;可以帶默認(rèn)參數(shù)值;

構(gòu)造函數(shù)的調(diào)用時機(jī)

在對象被創(chuàng)建時自動調(diào)用

默認(rèn)構(gòu)造函數(shù)

調(diào)用時可以不需要實參的構(gòu)造函數(shù):

  • 參數(shù)表為空的構(gòu)造函數(shù)
  • 全部參數(shù)都有默認(rèn)值的構(gòu)造函數(shù)

隱含生成的構(gòu)造函數(shù)

如果程序中未定義構(gòu)造函數(shù),編譯器將在需要時自動生成一個默認(rèn)構(gòu)造函數(shù)

  • 參數(shù)列表為空,不為數(shù)據(jù)成員設(shè)置初始值
  • 如果類內(nèi)定義了成員的初始值,則使用類內(nèi)定義的初始值
  • 如果沒有定義類內(nèi)的初始值,則以默認(rèn)方式初始化
  • 基本類型的數(shù)據(jù)默認(rèn)初始化的值是不確定的

"=default"

如果類中已定義構(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ù)

類中往往有多個構(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){}

復(fù)制構(gòu)造函數(shù)

用一個已經(jīng)存在的對象,去初始化新的對象

  • 隱含生成的復(fù)制構(gòu)造函數(shù)可以實現(xiàn)對應(yīng)數(shù)據(jù)成員一一復(fù)制
  • 自定義的復(fù)制構(gòu)造函數(shù)可以實現(xiàn)特殊的復(fù)制功能

復(fù)制構(gòu)造函數(shù)定義

復(fù)制構(gòu)造函數(shù)是一種特殊的構(gòu)造函數(shù),其形參為本類的對象引用

class 類名 {
public:
    類名 (形參);//構(gòu)造函數(shù)
    類名 (const 類名&對象名);//復(fù)制構(gòu)造函數(shù)
    // ...
};
類名::類(const 類名&對象名) //復(fù)制構(gòu)造函數(shù)
{ 函數(shù)體 }

"=delete"

若不希望對象被復(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ù)制構(gòu)造函數(shù)被調(diào)用的三種情況

    • 定義一個對象時,以本類另一個對象作為初始值,發(fā)生復(fù)制構(gòu)造
    • 如果函數(shù)的形參是類的對象,調(diào)用函數(shù)時,將使用實參對象初始化形參對象,發(fā)生復(fù)制構(gòu)造
    • 如果函數(shù)的返回值是類的對象,函數(shù)執(zhí)行完成返回主調(diào)函數(shù)時,將使用return語句中的對象初始化一個臨時無名對象,傳遞給主調(diào)函數(shù),此時發(fā)生復(fù)制構(gòu)造

左值與右值

左值:位于復(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)庫中的move函數(shù)可將左值對象移動為右值

float n = 10;
float &&rr_n = std::move(n);//將n轉(zhuǎn)化為右值
//使用move函數(shù)承諾除對n重新賦值或銷毀外,不以rr_n以外方式使用

移動構(gòu)造函數(shù)

基于右值引用,移動構(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ù)體*/}
};
  • 移動構(gòu)造函數(shù)不分配新內(nèi)存,理論上不會報錯,為配合異常捕獲機(jī)制,需聲明noexcept表明不會拋出異常
  • 被移動的對象不應(yīng)再使用,需要銷毀或重新賦值

析構(gòu)函數(shù)

完成對象被刪除前的一些清理工作

在對象的生存期結(jié)束的時刻系統(tǒng)自動調(diào)用它,然后釋放此對象所屬的空間;如果程序中未聲明析構(gòu)函數(shù),編譯器將自動產(chǎn)生一個默認(rèn)的析構(gòu)函數(shù),其函數(shù)體為空。


網(wǎng)站欄目:C++基礎(chǔ)02-構(gòu)造函數(shù)-類與對象
本文鏈接:http://weahome.cn/article/dsoiphj.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部