欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C++繼承和動(dòng)態(tài)內(nèi)存分配

 更新時(shí)間:2022年01月23日 11:16:05   作者:梁唐  
這篇文章主要介紹了C++繼承和動(dòng)態(tài)內(nèi)存分配,當(dāng)我們的基類使用動(dòng)態(tài)內(nèi)存分配,并且重新定義賦值和復(fù)制構(gòu)造函數(shù),這會(huì)對(duì)派生類的實(shí)現(xiàn)有什么影響呢?我們帶罩疑問倆姐下面文章內(nèi)容吧

文章轉(zhuǎn)自微信 公眾號(hào):Coder梁(ID:Coder_LT)

1.簡(jiǎn)介

這里面有一個(gè)問題,當(dāng)我們的基類使用動(dòng)態(tài)內(nèi)存分配,并且重新定義賦值和復(fù)制構(gòu)造函數(shù),這會(huì)對(duì)派生類的實(shí)現(xiàn)有什么影響呢?

我們來看兩種情況:

2.派生類不用new

假設(shè)基類中使用了動(dòng)態(tài)內(nèi)存分配:

class baseDMA {
?private:
? ? ?char *label;
? ? ?int rating;
? ? public:
? ? ?baseDMA(const char* l="null", int r=0);
? ? ?baseDMA(const baseDMA& rs);
? ? ?virtual ~baseDMA();
? ? ?baseDMA &operator=(const baseDMA& rs);
};

在這個(gè)聲明里包含了構(gòu)造函數(shù)、析構(gòu)函數(shù)、復(fù)制構(gòu)造函數(shù)和重載賦值運(yùn)算符。

現(xiàn)在假設(shè)我們從baseDMA派生出了類lackDMA,但是后者不使用new

class lackDMA: public baseMDA {
? ?private:
? ? ?char color[40];
? ? public:
? ? ?...
};

問題來了,我們要不要給lackDMA這個(gè)類定義析構(gòu)函數(shù)、復(fù)制構(gòu)造函數(shù)和賦值運(yùn)算符呢?

答案是不需要。

首先是析構(gòu)函數(shù),這個(gè)很好想明白,如果我們沒有定義析構(gòu)函數(shù),那么編譯器會(huì)自動(dòng)定義一個(gè)不執(zhí)行任何操作的默認(rèn)析構(gòu)函數(shù)。實(shí)際上派生類的析構(gòu)函數(shù)往往會(huì)在執(zhí)行一些邏輯之后調(diào)用基類的構(gòu)造函數(shù),因?yàn)閘ackDMA類中的成員不是通過new創(chuàng)建的,因此不需要額外的操作,所以默認(rèn)析構(gòu)函數(shù)是合適的。

同樣的默認(rèn)復(fù)制構(gòu)造函數(shù)也會(huì)執(zhí)行非new創(chuàng)建成員的復(fù)制,所以對(duì)于color變量來說是沒問題的。并且在派生類當(dāng)中,默認(rèn)復(fù)制構(gòu)造函數(shù)除了會(huì)復(fù)制非new創(chuàng)建的成員之外,還會(huì)調(diào)用基類的復(fù)制構(gòu)造函數(shù)來復(fù)制父類成員的部分。所以,對(duì)于派生類lackDMA來說,我們使用默認(rèn)的復(fù)制構(gòu)造函數(shù)一樣沒有問題。

賦值也是一樣的,默認(rèn)的賦值運(yùn)算符也會(huì)自動(dòng)使用基類的賦值運(yùn)算符來對(duì)基類的成員進(jìn)行賦值。

3.派生類使用new

我們?cè)賮砜纯磁缮惍?dāng)中使用了new的情況。

class hasDMA: public baseMDA {
? ?private:
? ? ?char *style;
? ? public:
? ? ?...
};

hasDMA這個(gè)類當(dāng)中,我們添加了一個(gè)需要使用new創(chuàng)建的char*成員。在這種情況下,我們就沒辦法使用默認(rèn)的函數(shù)了,就必須定義顯式析構(gòu)函數(shù)、復(fù)制構(gòu)造函數(shù)和賦值運(yùn)算符了,我們一個(gè)一個(gè)來看。

首先是析構(gòu)函數(shù),派生類的析構(gòu)函數(shù)會(huì)自動(dòng)調(diào)用基類的析構(gòu)函數(shù),所以我們只需要在析構(gòu)函數(shù)當(dāng)中釋放派生類中獨(dú)有的成員變量即可。

hasDMA::~hasDMA() {
? ? delete []style;
}

然后我們?cè)賮砜纯纯截悩?gòu)造函數(shù),由于派生類不能訪問基類private成員,所以我們需要調(diào)用基類的拷貝構(gòu)造函數(shù)。

hasDMA::hasDMA(const hasDMA& hs): baseDMA(hs) {
? ? style = new char[std::strlen(hs.style) + 1];
? ? std::strcpy(style, hs.style);
}

最后是賦值運(yùn)算符,同樣,由于派生類不能訪問基類中私有成員,我們也需要借助基類的賦值運(yùn)算符:

hasDMA &hasDMA::operator(const hasDMA& hs) {
? ? if (this == &hs) return *this;
? ? baseDMA::operator=(hs);
? ? delete []style;
? ? style = new char[std::strlen(hs.style) + 1];
? ? std::strcpy(style, hs.style);
? ? return *this;
}

這當(dāng)中有一個(gè)語句看起來有些奇怪:

baseDMA::operator=(hs);

這是我們手動(dòng)顯式調(diào)用了基類的賦值運(yùn)算符,我們直接用等于號(hào)賦值也有同樣的效果:

*this = hs;

為什么不這么干呢?這是因?yàn)榫幾g器在執(zhí)行的時(shí)候會(huì)默認(rèn)調(diào)用子類的賦值運(yùn)算符hasDMA::operator=,從而導(dǎo)致一直遞歸導(dǎo)致死循環(huán)。

所以我們需要手動(dòng)寫明作用域解析符,表明這是調(diào)用的父類賦值運(yùn)算符,而非派生類的運(yùn)算符,這一點(diǎn)比較隱晦,要千萬注意。

到此這篇關(guān)于C++繼承和動(dòng)態(tài)內(nèi)存分配的文章就介紹到這了,更多相關(guān)C++繼承和動(dòng)態(tài)內(nèi)存分配內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C語言實(shí)現(xiàn)簡(jiǎn)單圖書管理系統(tǒng)

    C語言實(shí)現(xiàn)簡(jiǎn)單圖書管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)圖書管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • 詳解C語言中的預(yù)處理命令

    詳解C語言中的預(yù)處理命令

    初學(xué)C語言的時(shí)候,我們會(huì)在開頭寫下一句話,#include<stdio.h>,這就是預(yù)處理命令,下面我們通過這篇文章來了解一下,感興趣的可以跟隨小編一起學(xué)習(xí)一下
    2022-12-12
  • C語言中字符型數(shù)據(jù)和浮點(diǎn)型數(shù)據(jù)介紹

    C語言中字符型數(shù)據(jù)和浮點(diǎn)型數(shù)據(jù)介紹

    大家好,本篇文章主要講的是C語言中字符型數(shù)據(jù)和浮點(diǎn)型數(shù)據(jù)介紹,感興趣的同學(xué)趕快來看一看吧,對(duì)你有幫助的話記得收藏一下,方便下次瀏覽
    2022-01-01
  • C++基于人工智能搜索策略解決農(nóng)夫過河問題示例

    C++基于人工智能搜索策略解決農(nóng)夫過河問題示例

    這篇文章主要介紹了C++基于人工智能搜索策略解決農(nóng)夫過河問題,簡(jiǎn)單描述了農(nóng)夫過河問題的概念、實(shí)現(xiàn)原理并結(jié)合具體實(shí)例形式給出了C++使用人工智能搜索策略解決農(nóng)夫過河問題的相關(guān)操作技巧,需要的朋友可以參考下
    2017-12-12
  • 詳解C語言之函數(shù)

    詳解C語言之函數(shù)

    本文是小結(jié)了一下C語言的函數(shù)語法,詳細(xì)介紹了C語言函數(shù)語法的概述、函數(shù)的定義、函數(shù)的返回值、函數(shù)調(diào)用等7個(gè)方面的內(nèi)容,非常詳細(xì),這里推薦給小伙伴們
    2021-11-11
  • 淺析結(jié)束程序函數(shù)exit, _exit,atexit的區(qū)別

    淺析結(jié)束程序函數(shù)exit, _exit,atexit的區(qū)別

    在一個(gè)程序中最多可以用atexit()注冊(cè)32個(gè)處理函數(shù),這些處理函數(shù)的調(diào)用順序與其注冊(cè)的順序相反,也即最先注冊(cè)的最后調(diào)用,最后注冊(cè)的最先調(diào)用
    2013-09-09
  • C++實(shí)現(xiàn)掃雷小游戲

    C++實(shí)現(xiàn)掃雷小游戲

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)掃雷小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-03-03
  • C++中4種強(qiáng)制類型轉(zhuǎn)換的區(qū)別詳析

    C++中4種強(qiáng)制類型轉(zhuǎn)換的區(qū)別詳析

    這篇文章主要給大家介紹了關(guān)于C++中4種強(qiáng)制類型轉(zhuǎn)換區(qū)別的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • C語言趣味編程之水仙花數(shù)

    C語言趣味編程之水仙花數(shù)

    這篇文章介紹了C語言趣味編程之水仙花數(shù),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-11-11
  • C++函數(shù)重載的深入解析

    C++函數(shù)重載的深入解析

    在C++中,我們也能夠把具有相同功能的函數(shù)整合到一個(gè)函數(shù)上,而不必去寫好多個(gè)函數(shù)名不同的函數(shù),這叫做函數(shù)的重載。以下是對(duì)C++中的函數(shù)重載進(jìn)行了詳細(xì)的分析介紹,需要的朋友可以過來參考下
    2013-07-07

最新評(píng)論