最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++全面精通類與對(duì)象

 更新時(shí)間:2022年05月27日 11:43:17   作者:?jiǎn)虇碳业凝堼? 
類和對(duì)象是兩種以計(jì)算機(jī)為載體的計(jì)算機(jī)語(yǔ)言的合稱。對(duì)象是對(duì)客觀事物的抽象,類是對(duì)對(duì)象的抽象。類是一種抽象的數(shù)據(jù)類型;變量就是可以變化的量,存儲(chǔ)在內(nèi)存中—個(gè)可以擁有在某個(gè)范圍內(nèi)的可變存儲(chǔ)區(qū)域

運(yùn)算符重載

C++語(yǔ)法設(shè)計(jì)很巧妙,比如運(yùn)算符重載一個(gè) >

bool operator>(const Date& d)
{
     return !(*this <= d);
}

這里可以結(jié)合前面的內(nèi)聯(lián)函數(shù)來(lái)進(jìn)一步提高代碼的效率,而內(nèi)聯(lián)函數(shù)不支持 .h 和 .cpp 分開(kāi)寫,所以成員函數(shù)要成為內(nèi)聯(lián)函數(shù)最好的辦法就是把定義放在類里面,類里面定義的會(huì)被默認(rèn)為是 inline 內(nèi)聯(lián)函數(shù)。

我們計(jì)算日期類的加法時(shí):

	Date Date::operator+(int d)
	{
		Date ret(*this);
		ret.day += d;
		while (ret.day > Getmonth(ret.year, ret.month))
		{
			ret.day -= Getmonth(ret.year,ret.month);
			ret.month++;
			if (ret.month == 13)
			{
				ret.year += 1;
				ret.month = 1;
			}
		}
		return ret;
	}

運(yùn)算符復(fù)用

我們可能會(huì)有這樣的問(wèn)題,這里面 += 和 + 兩個(gè)運(yùn)算符其實(shí)是一樣的,實(shí)現(xiàn)原理上沒(méi)什么差別,那你可能會(huì)封裝個(gè)函數(shù)來(lái)解決他們的關(guān)系,但是其實(shí)直接讓他倆互相附庸,分為了 += 復(fù)用+ 和 + 復(fù)用 += 兩種辦法:

1.+= 復(fù)用 +:

2.+ 復(fù)用 +=(更優(yōu)):

兩種乍一看其實(shí)沒(méi)什么區(qū)別,但是其實(shí)有優(yōu)越和劣勢(shì)可以分的,很 += 是不需要構(gòu)造的,因?yàn)樗莻饕谜{(diào)用(返回值為域外的 this 指針的內(nèi)容,必須要傳引用),但是 + 是必須要構(gòu)造的,拷貝局部對(duì)象的 ret 和 最后的 return , 一共需要構(gòu)造兩次。

讓 += 復(fù)用 +,+在先就會(huì)讓整個(gè)過(guò)程構(gòu)造 4 次,而讓 + 來(lái)復(fù)用 += 的話,+ 還是構(gòu)造 2 次沒(méi)得說(shuō),但是 += 就不需要拷貝構(gòu)造了,整個(gè)過(guò)程就只需要構(gòu)造 2 次,消耗就會(huì)小很多。咱就應(yīng)該多摳摳細(xì)節(jié),寫出正確的代碼固然重要,但是追求更優(yōu)秀更高效的代碼是每一個(gè)程序員的基本素養(yǎng)。

前置后置運(yùn)算符

既然 +,- 能造,那 ++ 和 – 自然也不在話下,但是這就不好玩了啊, num++ 和 ++num 功能上都是 +1,寫成運(yùn)算符重載格式都是

Date Date::operator++();

我們?cè)撛趺磪^(qū)分呢?要知道函數(shù)名相同而參數(shù)不同就應(yīng)該敏感使用函數(shù)重載,C++這個(gè)大聰明是不會(huì)考慮不到這些的,因此就有了對(duì)應(yīng)的語(yǔ)法:前置不帶參數(shù)而后置帶參數(shù)

Date operator++();//前置++

Date operator++(int d);//后置++

Date& operator++()//前置
{
   *this += 1;
   return *this;
}
Date operator++(int)//后置
{
    Date tmp(*this);
    *this += 1;
    return tem;
}

其實(shí)括號(hào)里面這個(gè)參數(shù)并沒(méi)有任何意義,單純只是用來(lái)區(qū)分前置與后置的寫法,所以這里不寫形參也是可以的,我這里就只給了一個(gè)類型。還有這里千萬(wàn)不要想著去加一個(gè)缺省值,顯式傳參還好,要是不傳參編譯器就沒(méi)辦法區(qū)分開(kāi)來(lái),屬于是沒(méi)事找事了。

const

給一個(gè)場(chǎng)景:

void Func(const Date& d)

{

d1.Print();

}

void test()

{

Date d1(2022,5,19);

d1.Print();

Func(d1);

}

這個(gè)場(chǎng)景下就會(huì)報(bào)錯(cuò):

說(shuō)實(shí)在的,這個(gè)報(bào)錯(cuò)我自己也看的云里霧里,為什么 Print 那里不報(bào)錯(cuò)到了 Func 里面 Print 就要報(bào)錯(cuò)?Print 傳的過(guò)去 Func 就傳不過(guò)去了?究其為什么會(huì)報(bào)錯(cuò),其實(shí)涉及到一個(gè)權(quán)限問(wèn)題。

void Print(Date* const this)
{
     cout<<year<<"-"<<month<<"-"<<day<<endl;
}

我們知道 Print() 的參數(shù)其實(shí)是 Date& const this ,在上面場(chǎng)景中去調(diào)用 Print 時(shí)其實(shí)參數(shù)是 &d1,傳對(duì)象的地址。在 Print 定義時(shí) const 修飾的是 this 指針,const 修飾的變量可以初始化,此時(shí)指針不能被改變但是他指向的內(nèi)容可以被初始化和修改;而 Func 的 const 修飾 Date*,他指向的內(nèi)容不能被修改,所以這是一個(gè)經(jīng)典的權(quán)限放大問(wèn)題。

const Date* 要傳給 Date* ,所以我們需要一個(gè) const 進(jìn)行修飾保護(hù),但是 this 本質(zhì)是一個(gè)隱含形參,我們沒(méi)辦法顯式調(diào)用,也就是說(shuō) const 沒(méi)辦法進(jìn)行修飾。那么C++也提供了一種修飾方法打破這個(gè)僵局,就是在函數(shù)尾巴加上 const。

void Print() const
{}

尾巴上的 const 編譯器就會(huì)默認(rèn)你是加在了函數(shù)原本定義的前面,這樣就完美了。

C++ 的IO流

我們?cè)诖a中使用的 << , >> 為流輸入和流提取操作符,只要涉及輸入或者輸出數(shù)據(jù),我們立馬想到的就是 cin 和 cout,這倆貨其實(shí)是全局的對(duì)象, cin 對(duì)應(yīng) istream 類,cout 對(duì)應(yīng) ostream 類,它們都聲明在 頭文件中,這也解釋了“為什么在 C++ 程序中引入 就可以使用 cin 和 cout”。

我們之所以可以在 <<, >> 之后接上任何類型,是因?yàn)閺?qiáng)大的語(yǔ)法對(duì)每種類型進(jìn)行了重載,能自動(dòng)識(shí)別類型的本質(zhì)就是函數(shù)重載,所以如果一個(gè) int 類型的流插入 cin<<1 其實(shí)是 cin . operator <<(1)。

初始化列表

與其他函數(shù)不同,構(gòu)造函數(shù)除了有名字,參數(shù)列表和函數(shù)體之外,還可以有初始化列表,初始化列表以冒號(hào)開(kāi)頭,后跟一系列以逗號(hào)分隔的初始化字段,初始化列表可以看成是對(duì)象的成員變量定義的地方:

class Func
{
public:
    Func(int a):
    _a(a){} // 初始化列表
private:
    int _a;
};

注意:每個(gè)成員變量在初始化列表中只能出現(xiàn)一次因?yàn)槌跏蓟荒艹跏蓟淮?,還要明確哪些成員必須放在初始化列表進(jìn)行初始化:

  1. 引用成員變量
  2. const 成員變量
  3. 自義定類型成員(該類沒(méi)有默認(rèn)構(gòu)造函數(shù))

其他變量即可以在初始化列表初始化也可以在函數(shù)體內(nèi)初始化,內(nèi)置類型成員不處理時(shí),會(huì)調(diào)用默認(rèn)構(gòu)造函數(shù)即隨機(jī)值,如果我給出缺省值,那么之這個(gè)值就是給初始化列表用的,如果在初始化列表也同時(shí)給出這個(gè)內(nèi)置類型的初始化值,就會(huì)采用初始化列表的值。我們應(yīng)該盡量在初始化列表就初始化完,這樣能盡可能的減少很多毛病效率也高。

再來(lái)看看這個(gè)題目:

這個(gè)程序的結(jié)果是啥?

答案是 1 和隨機(jī)值,因?yàn)槌蓡T變量在類中的聲明次序就是他在初始化列表中的初始化順序,與他在初始化列表中的先后次序無(wú)關(guān)。_a2 先聲明 _a2 = _a1,此時(shí) _a1 為隨機(jī)值,所以 _a2 為隨機(jī)值,_a1 為 1。

explicit 關(guān)鍵字

構(gòu)造函數(shù)不僅可以構(gòu)造和初始化對(duì)象,對(duì)于單個(gè)參數(shù)的構(gòu)造函數(shù),還具有類型轉(zhuǎn)換的作用。在C語(yǔ)言里面我們就知道有隱式類型轉(zhuǎn)換,其實(shí)在 C++ 里面也是一樣的,比如針對(duì)我定義的一個(gè) Date(int year):

Date d1(2022);
Date d2 = 2022;

顯然, 這里 d2 需要的是 Date 類型的參數(shù), 而我們傳入的是一個(gè)int, 這個(gè)程序卻能成功運(yùn)行, 就是因?yàn)檫@隱式調(diào)用,另外說(shuō)一句, 在對(duì)象剛剛定義時(shí), 即使使用的是賦值操作符 = , 也是會(huì)調(diào)用構(gòu)造函數(shù), 而不是重載的 operator= 運(yùn)算符。這兩個(gè)語(yǔ)句對(duì)應(yīng)前者是構(gòu)造,而后者是構(gòu)造+拷貝構(gòu)造,相當(dāng)于發(fā)生了隱式類型轉(zhuǎn)換, 如果我們寫成:

explicit Date(int year)

這個(gè)關(guān)鍵字會(huì)阻止這種轉(zhuǎn)換的發(fā)生。

到此這篇關(guān)于C++全面精通類與對(duì)象的文章就介紹到這了,更多相關(guān)C++類與對(duì)象內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C++析構(gòu)函數(shù)內(nèi)部工作機(jī)制詳解

    C++析構(gòu)函數(shù)內(nèi)部工作機(jī)制詳解

    析構(gòu)函數(shù)(Destructor)也是一種特殊的成員函數(shù),沒(méi)有返回值,不需要程序員顯式調(diào)用(程序員也沒(méi)法顯式調(diào)用),而是在銷毀對(duì)象時(shí)自動(dòng)執(zhí)行。構(gòu)造函數(shù)的名字和類名相同,而析構(gòu)函數(shù)的名字是在類名前面加一個(gè)~符號(hào)
    2023-02-02
  • C語(yǔ)言折半查找法的由來(lái)及使用詳解

    C語(yǔ)言折半查找法的由來(lái)及使用詳解

    折半查找法也叫做?分查找,顧名思義就是把數(shù)據(jù)分成兩半,再判斷所查找的key在哪?半中,再重復(fù)上述步驟知道找到?標(biāo)key,下面這篇文章主要給大家介紹了關(guān)于C語(yǔ)言折半查找法的相關(guān)資料,需要的朋友可以參考下
    2022-08-08
  • 利用boost獲取時(shí)間并格式化的方法

    利用boost獲取時(shí)間并格式化的方法

    下面小編就為大家?guī)?lái)一篇利用boost獲取時(shí)間并格式化的方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-03-03
  • C++實(shí)現(xiàn)LeetCode(61.旋轉(zhuǎn)鏈表)

    C++實(shí)現(xiàn)LeetCode(61.旋轉(zhuǎn)鏈表)

    這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(61.旋轉(zhuǎn)鏈表),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • C++面試八股文之什么是構(gòu)造函數(shù)

    C++面試八股文之什么是構(gòu)造函數(shù)

    構(gòu)造函數(shù)是一種特殊的成員函數(shù),用于創(chuàng)建和初始化類的對(duì)象,這篇文章主要為大家詳細(xì)介紹了C++中構(gòu)造函數(shù)的相關(guān)知識(shí)點(diǎn),需要的可以參考一下
    2023-06-06
  • c++回調(diào)之利用函數(shù)指針示例

    c++回調(diào)之利用函數(shù)指針示例

    這篇文章主要介紹了c++利用函數(shù)指針示例,需要的朋友可以參考下
    2014-04-04
  • C/C++實(shí)現(xiàn)線性單鏈表的示例代碼

    C/C++實(shí)現(xiàn)線性單鏈表的示例代碼

    使用鏈存儲(chǔ)結(jié)構(gòu)的線性存儲(chǔ)結(jié)構(gòu)為線性單鏈表,本文將分別利用C語(yǔ)言和C++實(shí)現(xiàn)線性單鏈表,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2022-05-05
  • C++ accumulate函數(shù)詳細(xì)介紹和具體案例

    C++ accumulate函數(shù)詳細(xì)介紹和具體案例

    這篇文章主要介紹了C++ accumulate函數(shù)詳細(xì)介紹和具體案例,accumulate是numeric庫(kù)中的一個(gè)函數(shù),主要用來(lái)對(duì)指定范圍內(nèi)元素求和,但也自行指定一些其他操作,如范圍內(nèi)所有元素相乘、相除等
    2022-08-08
  • 基于C++編寫一個(gè)文章生成器

    基于C++編寫一個(gè)文章生成器

    這篇文章主要為大家介紹一個(gè)有趣的小程序,就是利用C++編寫一個(gè)文章生成器,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起了解一下
    2023-03-03
  • C++簡(jiǎn)單實(shí)現(xiàn)的全排列算法示例

    C++簡(jiǎn)單實(shí)現(xiàn)的全排列算法示例

    這篇文章主要介紹了C++簡(jiǎn)單實(shí)現(xiàn)的全排列算法,結(jié)合實(shí)例形式分析了C++排序操作的實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2017-07-07

最新評(píng)論

瓦房店市| 肇东市| 彰化市| 辉南县| 璧山县| 南昌市| 舞阳县| 英德市| 梅河口市| 岑巩县| 德庆县| 镇宁| 聂拉木县| 双鸭山市| 遵化市| 龙山县| 黑河市| 望江县| 丰城市| 合作市| 安吉县| 洞头县| 余干县| 东乡县| 仙居县| 重庆市| 沧源| 繁昌县| 巴东县| 乡城县| 巴楚县| 云南省| 蕲春县| 金寨县| 彭泽县| 明溪县| 盖州市| 潼关县| 城固县| 宜宾县| 鹤岗市|