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

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

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

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

1.簡介

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

我們來看兩種情況:

2.派生類不用new

假設(shè)基類中使用了動態(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òu)造函數(shù)、析構(gòu)函數(shù)、復(fù)制構(gòu)造函數(shù)和重載賦值運算符。

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

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

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

答案是不需要。

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

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

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

3.派生類使用new

我們再來看看派生類當(dāng)中使用了new的情況。

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

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

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

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

然后我們再來看看拷貝構(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);
}

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

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)中有一個語句看起來有些奇怪:

baseDMA::operator=(hs);

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

*this = hs;

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

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

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

相關(guān)文章

  • 淺析C語言中的內(nèi)存布局

    淺析C語言中的內(nèi)存布局

    以下是對C語言中的內(nèi)存布局進(jìn)行了詳細(xì)的分析介紹。需要的朋友可以過來參考下
    2013-08-08
  • Qt 實現(xiàn)畫線筆鋒效果詳細(xì)原理及示例代碼

    Qt 實現(xiàn)畫線筆鋒效果詳細(xì)原理及示例代碼

    這篇文章主要介紹了Qt 實現(xiàn)畫線筆鋒效果詳細(xì)原理及示例代碼。文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-04-04
  • 詳解C語言中scanf函數(shù)使用的一些注意點

    詳解C語言中scanf函數(shù)使用的一些注意點

    這篇文章主要介紹了C語言中scanf函數(shù)使用的一些注意點,scanf函數(shù)的使用是C語言入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下
    2016-04-04
  • C語言學(xué)生成績管理系統(tǒng)源代碼

    C語言學(xué)生成績管理系統(tǒng)源代碼

    這篇文章主要為大家詳細(xì)介紹了C語言學(xué)生成績管理系統(tǒng)源代碼,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-03-03
  • C語言中文件常見操作的示例詳解

    C語言中文件常見操作的示例詳解

    FILE為C語言提供的文件類型,它是一個結(jié)構(gòu)體類型,用于存放文件的相關(guān)信息。本文主要為大家介紹下C語言中幾個常見的文件操作的實現(xiàn),需要的可以參考一下
    2022-12-12
  • 深入分析C++中聲明與定義的區(qū)別

    深入分析C++中聲明與定義的區(qū)別

    C++學(xué)了這么多年你知道為什么定義類時,類的定義放在.h文件中,而類的實現(xiàn)放在cpp文件中。它們?yōu)槭裁茨軌蜿P(guān)聯(lián)到一起呢?你知道什么東西可以放在.h文件中,什么不能。什么東西又可以放在cpp文件中。如果你忘記了或是壓根就不明白,那么讀過此文你會清晰無比??!
    2014-09-09
  • C語言實現(xiàn)刪除某一個數(shù)組值的方法

    C語言實現(xiàn)刪除某一個數(shù)組值的方法

    這篇文章主要給大家分享C語言數(shù)組中刪除數(shù)組中某個值的方法,既然要學(xué)習(xí)刪除數(shù)組中的元素,我們就必須得先知道數(shù)組中有哪些元素。同時還要定義一個變量,并將需要刪除的元素賦值給那個變量。下面來看看文章的詳細(xì)內(nèi)容吧
    2021-11-11
  • C語言實現(xiàn)奇數(shù)階魔方陣的方法

    C語言實現(xiàn)奇數(shù)階魔方陣的方法

    這篇文章主要介紹了C語言實現(xiàn)奇數(shù)階魔方陣的方法,涉及數(shù)組及相關(guān)數(shù)學(xué)函數(shù)的使用技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-02-02
  • C++面試八股文之位運算問題詳解

    C++面試八股文之位運算問題詳解

    這篇文章主要為大家介紹了C++面試八股文之位運算的問題解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-06-06
  • C語言實現(xiàn)密碼本小項目

    C語言實現(xiàn)密碼本小項目

    這篇文章主要為大家詳細(xì)介紹了C語言實現(xiàn)密碼本小項目,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-02-02

最新評論

阆中市| 龙江县| 齐齐哈尔市| 黄大仙区| 安丘市| 柳州市| 鹤庆县| 嘉禾县| 公主岭市| 安乡县| 绥中县| 柳河县| 开原市| 安义县| 台东市| 康保县| 遂川县| 平陆县| 深水埗区| 元谋县| 丰镇市| 开封市| 齐齐哈尔市| 阜南县| 德阳市| 交口县| 遂川县| 拜泉县| 武宁县| 通道| 繁昌县| 达日县| 临汾市| 隆子县| 蓬安县| 高碑店市| 青河县| 元朗区| 礼泉县| 兴仁县| 厦门市|