国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

C++之拷貝構造函數的淺copy及深copy

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

掃碼添加小助手

加入工程師交流群

一、深拷貝和淺拷貝構造函數總結:

1、兩個特殊的構造函數:

(1)無參構造函數:

沒有參數的構造函數

Class Test

public:
Test()

//這是一個無參構造函數

};

當類中沒有定義構造函數時,編譯器默認提供一個無參構造函數,并且其函數體為空;換句話來說,就是我們在類中,不用我們程序猿自己寫,編譯就自動提供了無參構造函數(只是我們肉眼看不到!)

#include <iostream>
#include <string>
class Test{
//編譯器默認給我們提供了一個無參構造函數,只是我們肉眼看不到
};
int main()

Test t;
return 0;

結果輸出(編譯時能夠通過的):

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

(2)拷貝構造函數:

參數為const class_name&的構造函數

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




當類中沒有定義拷貝構造函數時,編譯器默認提供了一個拷貝構造函數,簡單的進行成員變量的值賦值

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

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

};
int main()

Test t;
return 0;

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

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

(3)注意:

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

Test t;//對應無參構造函數
Test t(1);//對應有參構造函數
Test t1;
Test t2=t1;//對應拷貝構造函數

比如下面我定義的類對象屬于無參構造函數(當然前提是你手寫了其他構造函數,雖然說編譯器會默認提供,但是既然要手寫,那么三種構造函數就在定義類對象的時候按需求來寫),如果只寫了有參數構造函數,那么編譯器就會報錯:

#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;

輸出結果:

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、拷貝構造函數的意義:

(1)淺拷貝

拷貝后對象的物理狀態相同

(2)深拷貝

拷貝后對象的邏輯狀態相同

(3)編譯器提供的拷貝構造函數只進行淺拷貝

代碼版本一:

#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;

輸出結果:

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)

注解:出現了段錯誤,仔細分析,我們發現這里釋放了堆空間兩次(因為我們這里沒有調用拷貝構造函數,也就是自己去寫拷貝構造函數;所以這種情況是淺拷貝,不能釋放兩次堆空間):

代碼版本二(加上拷貝構造函數):

#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;

輸出結果:

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地址空間來看,就知釋放的兩個對象的堆空間不同,不再是指向同一堆空間了;同時我們發現淺拷貝只是簡單數值上的進行賦值而已;深拷貝不只是簡單的值賦值,而是從內存的角度來看,是操作不同的內存。

5、什么時候需要進行深拷貝?

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

成員指向了動態內存空間

成員打開了外存中的文件

成員使用了系統中的網絡端口

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

二、總結:

C++編譯器會默認提供構造函數

無參構造函數用于定義對象的默認初始化狀態

拷貝構造函數在創建對象時拷貝對象的狀態

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

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

審核編輯:符乾江
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 可編程邏輯
    +關注

    關注

    7

    文章

    526

    瀏覽量

    45402
  • C++
    C++
    +關注

    關注

    22

    文章

    2123

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    keil實現cc++混合編程

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

    內存拷貝函數 memcpy原理及實現

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

    C語言與C++的區別及聯系

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

    CC++之間的聯系

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

    C語言和C++之間的區別是什么

    區別 1、面向對象編程 (OOP): C語言是一種面向過程的語言,它強調的是通過函數將任務分解為一系列步驟進行執行。 C++C語言的基礎上擴展了面向對象的特性,支持類(class)
    發表于 12-11 06:23

    C++程序異常的處理機制

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

    強實時運動控制內核MotionRT750(六):us級高速交互C++,為智能裝備提速

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

    基于LockAI視覺識別模塊:C++目標檢測

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

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

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

    嵌入式學習-飛凌嵌入式ElfBoard ELF 1板卡-內核空間與用戶空間的數據拷貝獲取用戶空間數據

    例程代碼路徑:ELF 1開發板資料包\\03-例程源碼\\03-2 驅動例程源碼\\03_內核空間與用戶空間的數據拷貝\\copy_form_user 在copy_to_user.c源碼的基礎上添加
    發表于 03-22 09:25

    嵌入式學習-飛凌嵌入式ElfBoard ELF 1板卡-內核空間與用戶空間的數據拷貝獲取內核空間數據

    例程代碼路徑:ELF 1開發板資料包\\03-例程源碼\\03-2 驅動例程源碼\\03_內核空間與用戶空間的數據拷貝\\copy_to_user 在mydevice-auto.c源碼的基礎上
    發表于 03-21 14:00

    飛凌嵌入式ElfBoard ELF 1板卡-內核空間與用戶空間的數據拷貝獲取用戶空間數據

    例程代碼路徑:ELF 1開發板資料包\\03-例程源碼\\03-2 驅動例程源碼\\03_內核空間與用戶空間的數據拷貝\\copy_form_user 在copy_to_user.c源碼的基礎上添加
    發表于 03-21 13:58

    嵌入式學習-飛凌嵌入式ElfBoard ELF 1板卡-內核空間與用戶空間的數據拷貝數據拷貝介紹

    空間之間進行數據傳輸時,需要進行數據拷貝操作。Linux內核提供了幾種方法來實現內核空間與用戶空間之間的數據拷貝copy_to_user()和copy_from_user()這兩個
    發表于 03-20 11:50

    飛凌嵌入式ElfBoard ELF 1板卡-內核空間與用戶空間的數據拷貝獲取內核空間數據

    拷貝\\copy_to_user在mydevice-auto.c源碼的基礎上進行添加,重命名為copy_to_user.c(一)添加頭文件#include(二)定義變量#define
    發表于 03-20 11:48

    飛凌嵌入式ElfBoard ELF 1板卡-內核空間與用戶空間的數據拷貝數據拷貝介紹

    空間與用戶空間之間的數據拷貝copy_to_user()和copy_from_user()這兩個函數用于在內核空間和用戶空間之間進行數據拷貝
    發表于 03-19 08:55