日B视频 亚洲,啪啪啪网站一区二区,91色情精品久久,日日噜狠狠色综合久,超碰人妻少妇97在线,999青青视频,亚洲一区二卡,让本一区二区视频,日韩网站推荐

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

C++之拷貝構(gòu)造函數(shù)的淺copy及深copy

電子設(shè)計(jì) ? 來源:電子設(shè)計(jì) ? 作者:電子設(shè)計(jì) ? 2020-12-24 15:31 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

一、深拷貝和淺拷貝構(gòu)造函數(shù)總結(jié):

1、兩個(gè)特殊的構(gòu)造函數(shù):

(1)無參構(gòu)造函數(shù):

沒有參數(shù)的構(gòu)造函數(shù)

Class Test

public:
Test()

//這是一個(gè)無參構(gòu)造函數(shù)

};

當(dāng)類中沒有定義構(gòu)造函數(shù)時(shí),編譯器默認(rèn)提供一個(gè)無參構(gòu)造函數(shù),并且其函數(shù)體為空;換句話來說,就是我們在類中,不用我們程序猿自己寫,編譯就自動提供了無參構(gòu)造函數(shù)(只是我們?nèi)庋劭床坏剑。?/p>

#include <iostream>
#include <string>
class Test{
//編譯器默認(rèn)給我們提供了一個(gè)無參構(gòu)造函數(shù),只是我們?nèi)庋劭床坏?br /> };
int main()

Test t;
return 0;

結(jié)果輸出(編譯時(shí)能夠通過的):

root@txp-virtual-machine:/home/txp# g++ test.cpp
root@txp-virtual-machine:/home/txp#

(2)拷貝構(gòu)造函數(shù):

參數(shù)為const class_name&的構(gòu)造函數(shù)

class Test{
public:
Test(const Test& p)




當(dāng)類中沒有定義拷貝構(gòu)造函數(shù)時(shí),編譯器默認(rèn)提供了一個(gè)拷貝構(gòu)造函數(shù),簡單的進(jìn)行成員變量的值賦值

#include <iostream>
#include <string>
class Test{
private:
int i;
int j;
public:
Test(const Test& p)編譯器默認(rèn)提供這樣操作的

i = p.i;
j = p.j;

};
int main()

Test t;
return 0;

輸出結(jié)果(編譯可以通過):

root@txp-virtual-machine:/home/txp# g++ test.cpp
root@txp-virtual-machine:/home/txp#

(3)注意:

在寫程序的時(shí)候,定義的類對象初始化時(shí)看屬于哪種類型的:

Test t;//對應(yīng)無參構(gòu)造函數(shù)
Test t(1);//對應(yīng)有參構(gòu)造函數(shù)
Test t1;
Test t2=t1;//對應(yīng)拷貝構(gòu)造函數(shù)

比如下面我定義的類對象屬于無參構(gòu)造函數(shù)(當(dāng)然前提是你手寫了其他構(gòu)造函數(shù),雖然說編譯器會默認(rèn)提供,但是既然要手寫,那么三種構(gòu)造函數(shù)就在定義類對象的時(shí)候按需求來寫),如果只寫了有參數(shù)構(gòu)造函數(shù),那么編譯器就會報(bào)錯(cuò):

#include <iostream>
#include <string>
class Test{
private:
int i;
int j;
public:
Test(int a)

i = 9;
j=8;

Test(const Test& p)

i = p.i;
j = p.j;

};
int main()

Test t;
return 0;

輸出結(jié)果:

root@txp-virtual-machine:/home/txp# g++ test.cpp
test.cpp: In function ‘int main()’:
test.cpp:25:9: error: no matching function for call to ‘Test::Test()’
Test t;

test.cpp:25:9: note: candidates are:
test.cpp:15:3: note: Test::Test(const Test&)
Test(const Test& p)

test.cpp:15:3: note: candidate expects 1 argument, 0 provided
test.cpp:10:3: note: Test::Test(int)
Test(int a)

test.cpp:10:3: note: candidate expects 1 argument, 0 provided

4、拷貝構(gòu)造函數(shù)的意義:

(1)淺拷貝

拷貝后對象的物理狀態(tài)相同

(2)深拷貝

拷貝后對象的邏輯狀態(tài)相同

(3)編譯器提供的拷貝構(gòu)造函數(shù)只進(jìn)行淺拷貝

代碼版本一:

#include <stdio.h>
#include <string>
class Test{
private:
int i;
int j;
int *p;
public:
int getI()

return i;

int getJ()

return j;

int *getP()

return p;

Test(int a)

i = 2;
j = 3;
p = new int;
*p = a;

void free()

delete p;

};
int main()

Test t1(3);//Test t1 3;
Test t2 = t1;
printf("t1.i = %d, t1.j = %d, t1.p = %p", t1.getI(), t1.getJ(), t1.getP());
printf("t2.i = %d, t2.j = %d, t2.p = %p", t2.getI(), t2.getJ(), t2.getP());
t1.free();
t2.free();

return 0;

輸出結(jié)果:

root@txp-virtual-machine:/home/txp# g++ test.cpp
root@txp-virtual-machine:/home/txp# ./a.out
t1.i = 2, t1.j = 3, t1.p = 0x1528010
t2.i = 2, t2.j = 3, t2.p = 0x1528010
*** Error in `./a.out': double free or corruption (fasttop): 0x0000000001528010 ***
Aborted (core dumped)

注解:出現(xiàn)了段錯(cuò)誤,仔細(xì)分析,我們發(fā)現(xiàn)這里釋放了堆空間兩次(因?yàn)槲覀冞@里沒有調(diào)用拷貝構(gòu)造函數(shù),也就是自己去寫拷貝構(gòu)造函數(shù);所以這種情況是淺拷貝,不能釋放兩次堆空間):

代碼版本二(加上拷貝構(gòu)造函數(shù)):

#include <stdio.h>
#include <string>
class Test{
private:
int i;
int j;
int *p;
public:
int getI()

return i;

int getJ()

return j;

int *getP()

return p;

Test(int a)

i = 2;
j = 3;
p = new int;
*p = a;

Test(const Test& t)

i = t.i;
j = t.j;
p = new int;
*p = *t.p;

void free()

delete p;

};
int main()

Test t1(4);
Test t2 = t1;
printf("t1.i = %d, t1.j = %d, t1.p = %p", t1.getI(), t1.getJ(), t1.getP());
printf("t2.i = %d, t2.j = %d, t2.p = %p", t2.getI(), t2.getJ(), t2.getP());
t1.free();
t2.free();
return 0;

輸出結(jié)果:

root@txp-virtual-machine:/home/txp# g++ test.cpp
root@txp-virtual-machine:/home/txp# ./a.out
t1.i = 2, t1.j = 3, t1.p = 0xb0a010
t2.i = 2, t2.j = 3, t2.p = 0xb0a030

注解:從打印的p地址空間來看,就知釋放的兩個(gè)對象的堆空間不同,不再是指向同一堆空間了;同時(shí)我們發(fā)現(xiàn)淺拷貝只是簡單數(shù)值上的進(jìn)行賦值而已;深拷貝不只是簡單的值賦值,而是從內(nèi)存的角度來看,是操作不同的內(nèi)存。

5、什么時(shí)候需要進(jìn)行深拷貝?

(1)對象中有成員指代了系統(tǒng)中的資源

成員指向了動態(tài)內(nèi)存空間

成員打開了外存中的文件

成員使用了系統(tǒng)中的網(wǎng)絡(luò)端口

注意:一般來說,自定義拷貝構(gòu)造函數(shù)(也就是我們自己手寫的),必然需要實(shí)現(xiàn)深拷貝!

二、總結(jié):

C++編譯器會默認(rèn)提供構(gòu)造函數(shù)

無參構(gòu)造函數(shù)用于定義對象的默認(rèn)初始化狀態(tài)

拷貝構(gòu)造函數(shù)在創(chuàng)建對象時(shí)拷貝對象的狀態(tài)

對象的拷貝有淺拷貝和深拷貝兩種方式。

好了,今天的分享就到這里,如果文章中有錯(cuò)誤或者不理解的地方,可以交流互動,一起進(jìn)步。我是txp,下期見!

審核編輯:符乾江
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • 可編程邏輯
    +關(guān)注

    關(guān)注

    7

    文章

    529

    瀏覽量

    45470
  • C++
    C++
    +關(guān)注

    關(guān)注

    22

    文章

    2131

    瀏覽量

    77417
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點(diǎn)推薦

    使用VectorCAST/C++的AI輔助測試功能

    從2026版本開始,VectorCAST/C++推出首批AI輔助測試功能,旨在幫助開發(fā)團(tuán)隊(duì)解決單元測試過程中的兩個(gè)核心難點(diǎn):
    的頭像 發(fā)表于 04-27 14:37 ?299次閱讀

    C++與lua聯(lián)合編程

    的出現(xiàn),在經(jīng)濟(jì)上相當(dāng)于建立了一個(gè)高度標(biāo)準(zhǔn)化的“自由貿(mào)易區(qū)”或“中轉(zhuǎn)倉庫”。無論 C++ 想傳給 Lua 一個(gè)復(fù)雜的嵌套表,還是 Lua 想回調(diào) C++ 的一個(gè)函數(shù),都不需要直接面對對方混亂的內(nèi)存布局,而是
    發(fā)表于 04-19 16:27

    C++:const 的空間,常量也能占內(nèi)存?

    ] != BLACK)): return True return False c++語言5g.FsW.dgdfgsg.cnJIWWQc++語言 c++語言5g.I5y.dgdfgsg.cnJIWWQc++
    發(fā)表于 04-16 19:19

    keil實(shí)現(xiàn)cc++混合編程

    參考touchgfx生成的代碼,發(fā)現(xiàn)了一個(gè)不需要添加--cpp11 參數(shù)的解決方法,具體操作如下。 一、創(chuàng)建一個(gè)空白的C文件和頭文件在頭文件中定義c++文件中需要調(diào)用的函數(shù),如圖所示 二、在
    發(fā)表于 01-26 08:58

    內(nèi)存拷貝函數(shù) memcpy原理及實(shí)現(xiàn)

    內(nèi)存拷貝函數(shù)memcpymemcpy是memory copy的縮寫,意為內(nèi)存復(fù)制,在寫C語言程序的時(shí)候,我們常常會用到它。它的函原型如下:void *memcpy(void *dest
    發(fā)表于 12-26 08:03

    C語言與C++的區(qū)別及聯(lián)系

    創(chuàng)建源文件時(shí)什么都不給,默認(rèn)是.cpp。 3、返回值 C語言中,如果一個(gè)函數(shù)沒有指定返回值類型,默認(rèn)返回int類型;C++中,如果一個(gè)函數(shù)沒有返回值則必須指定為void。 4、參
    發(fā)表于 12-24 07:23

    CC++之間的聯(lián)系

    1、語法兼容性: C++完全兼容C語言的語法,這意味著任何有效的C語言程序都可以直接在C++編譯器下編譯通過。 2、底層控制: C++
    發(fā)表于 12-11 06:51

    C語言和C++之間的區(qū)別是什么

    區(qū)別 1、面向?qū)ο缶幊?(OOP): C語言是一種面向過程的語言,它強(qiáng)調(diào)的是通過函數(shù)將任務(wù)分解為一系列步驟進(jìn)行執(zhí)行。 C++C語言的基礎(chǔ)上擴(kuò)展了面向?qū)ο蟮奶匦裕С诸?class)
    發(fā)表于 12-11 06:23

    C++程序異常的處理機(jī)制

    運(yùn)行代碼進(jìn)行分離,使得程序更加模塊化;另一方面,C++的異常處理可以不需要異常處理在異常發(fā)生時(shí)的同一個(gè)函數(shù),而是可以在更上層合適的位置進(jìn)行處理。 下面,我們一起來看看C++的異常處理。 2、異常處理
    發(fā)表于 12-02 07:12

    C/C++代碼靜態(tài)測試工具Perforce QAC 2025.3的新特性

    ?Perforce Validate?中?QAC?項(xiàng)目的相對/根路徑的支持。C++?分析也得到了增強(qiáng),增加了用于檢測 C++?并發(fā)問題的新檢查,并改進(jìn)了實(shí)體名稱和實(shí)
    的頭像 發(fā)表于 10-13 18:11 ?760次閱讀
    <b class='flag-5'>C</b>/<b class='flag-5'>C++</b>代碼靜態(tài)測試工具Perforce QAC 2025.3的新特性

    強(qiáng)實(shí)時(shí)運(yùn)動控制內(nèi)核MotionRT750(六):us級高速交互C++,為智能裝備提速

    Windows下運(yùn)動控制實(shí)時(shí)內(nèi)核MotionRT750的高速交互C++
    的頭像 發(fā)表于 09-04 14:50 ?946次閱讀
    強(qiáng)實(shí)時(shí)運(yùn)動控制內(nèi)核MotionRT750(六):us級高速交互<b class='flag-5'>之</b><b class='flag-5'>C++</b>,為智能裝備提速

    技能+1!如何在樹莓派上使用C++控制GPIO?

    在使用樹莓派時(shí),你會發(fā)現(xiàn)Python和Scratch是許多任務(wù)(包括GPIO編程)中最常用的編程語言。但你知道嗎,你也可以使用C++進(jìn)行GPIO編程,而且這樣做還有不少好處。借助WiringPi
    的頭像 發(fā)表于 08-06 15:33 ?4521次閱讀
    技能+1!如何在樹莓派上使用<b class='flag-5'>C++</b>控制GPIO?

    基于LockAI視覺識別模塊:C++目標(biāo)檢測

    本文檔基于瑞芯微RV1106的LockAI凌智視覺識別模塊,通過C++語言做的目標(biāo)檢測實(shí)驗(yàn)。本文檔展示了如何使用lockzhiner_vision_module::PaddleDet類進(jìn)行目標(biāo)檢測,并通過lockzhiner_vision_module::Visualize函數(shù)
    的頭像 發(fā)表于 06-06 13:56 ?1036次閱讀
    基于LockAI視覺識別模塊:<b class='flag-5'>C++</b>目標(biāo)檢測

    飛凌嵌入式ElfBoard ELF 1板卡-uboot編譯system.map/uboot.map

    system.map是一個(gè)符號表,其中包括符號名、符號類型、符號值。符號(sysmbol):包括已定義的符號(對應(yīng)全局變量和static變量和定義的函數(shù)的名字)和未定義符號(未定義的函數(shù)的名字和引用
    發(fā)表于 05-22 11:22

    主流的 MCU 開發(fā)語言為什么是 C 而不是 C++

    在單片機(jī)的地界兒里,C語言穩(wěn)坐中軍帳,C++想分杯羹?難嘍。咱電子工程師天天跟那針尖大的內(nèi)存空間較勁,C++那些花里胡哨的玩意兒,在這兒真玩不轉(zhuǎn)。先說內(nèi)存這道坎兒。您當(dāng)stm32f4的256kRAM
    的頭像 發(fā)表于 05-21 10:33 ?1229次閱讀
    主流的 MCU 開發(fā)語言為什么是 <b class='flag-5'>C</b> 而不是 <b class='flag-5'>C++</b>?
    荥经县| 长治市| 阳朔县| 安岳县| 永胜县| 湟中县| 嘉定区| 马公市| 蓝山县| 磐安县| 灵山县| 巴楚县| 瑞安市| 宜兴市| 行唐县| 北宁市| 寿阳县| 克山县| 柞水县| 临邑县| 平乡县| 苏尼特右旗| 辽宁省| 门头沟区| 永嘉县| 牡丹江市| 武安市| 陇川县| 综艺| 正宁县| 河北省| 阳山县| 广平县| 宣汉县| 永登县| 客服| 通州市| 湄潭县| 仙居县| 开阳县| 讷河市|