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

C++拷貝構(gòu)造函數(shù)中的陷阱

 更新時間:2022年01月25日 16:48:28   作者:CPP開發(fā)前沿  
這篇文章主要介紹了C++拷貝構(gòu)造函數(shù)中的陷阱,拷貝構(gòu)造函數(shù)大家都比較熟悉,通俗講就是傳入一個對象,拷貝一份副本。不過看似簡單的東西,實際不注意的話就會產(chǎn)生問題,下面我們就來看看C++拷貝構(gòu)造函數(shù)中都有哪些陷阱吧

轉(zhuǎn)自微信公眾號:CPP開發(fā)前沿

拷貝構(gòu)造函數(shù)大家都比較熟悉,通俗講就是傳入一個對象,拷貝一份副本。
不過看似簡單的東西,實際不注意的話就會產(chǎn)生問題!

#include<iostream>
using namespace std;
class CExample
{
public:
int a,b,c;
char *str;
public:
//構(gòu)造函數(shù)
? ? CExample(int tb)
? ? {
? ? ? ? a = tb;
? ? ? ? b = tb+1;
? ? ? ? c = tb+2;
? ? ? ? str=(char *)malloc(sizeof(char)*10);
strcpy(str,"123456789");
cout<<"creat: "<<endl;
? ? }
?
//析構(gòu)函數(shù)
? ? ~CExample()
? ? {
cout<< "delete: "<<endl;
? ? }
void Show ()
{
cout<<a<<endl;
? ? }
//拷貝構(gòu)造
//CExample(const CExample& C)
//{
// ? ?str=(char *)malloc(sizeof(char)*10);
// ? ?strcpy(str,C.str);
// ? ?cout<<"copy"<<endl;
//}
};
//全局函數(shù),傳入的是對象
void g_Fun(CExample C)
{
? ? C.a=0;C.b=0;C.b=0;
strcpy(C.str,"aaabbbccc");
cout<<"test"<<endl;
}
int main()
{
CExample test(1);
cout<<"str:"<<test.str<<" a="<<test.a<<" b="<<test.b<<" c="<<test.c<<endl;
? ? g_Fun(test);//傳入對象
cout<<"str:"<<test.str<<" a="<<test.a<<" b="<<test.b<<" c="<<test.c<<endl;
? ? getchar();
return 0;
}

這個結(jié)果似乎出乎了我們的預(yù)料,作為形式參數(shù) test對象被修改了,同時是test.str的部分被修改了,test的整數(shù)成員變量沒有被修改!

咱們先了解一下系統(tǒng)默認(rèn)的拷貝構(gòu)造函數(shù),因為類中沒有寫自己的拷貝構(gòu)造函數(shù),所以調(diào)用的是默認(rèn)的拷貝構(gòu)造函數(shù)。

Thinking in c++:對于簡單結(jié)構(gòu),編譯器會自動生成一個缺省的,就是位拷貝(bitcopy)。

對于比較復(fù)雜的類型,編譯器就會自動生成一個缺省的拷貝構(gòu)造函數(shù)。

class CExample
{
int a,b,c;
};

這就是一個簡單結(jié)構(gòu)的類,位拷貝,就是按對象在內(nèi)存中的二進(jìn)制進(jìn)行拷貝,對于不涉及指針等類型的時候,位拷貝是比較不錯的拷貝方法。

但是,要是一個類中有指針類型的時候,如:

class CExample
{
int a,b,c;
char *str;
};

位拷貝就會把指針地址拷貝了一下,話句話說,這里只進(jìn)行了“淺拷貝”,一旦副本里涉及到指針的操作,必然就會影響到原始對象的成員變量,這就是導(dǎo)致,上面代碼中對象的整數(shù)變量沒被修改(對整數(shù)變量的位拷貝其實就是一種“深拷貝”),而str所指的對象被修改的原因。

那么該如何防止對副本的修改影響原始對象呢?

答案是用戶自定義拷貝構(gòu)造函數(shù)!

CExample(const CExample& C)
{
? ? a=C.a;b=C.b;c=C.b;
? ? str=(char *)malloc(sizeof(char)*10);
strcpy(str,C.str);
cout<<"copy"<<endl;
}

這樣就可以正確完成拷貝構(gòu)造的操作了。

總結(jié):對于簡單的數(shù)據(jù)類型,可以使用系統(tǒng)默認(rèn)的拷貝構(gòu)造函數(shù);但對于復(fù)雜的數(shù)據(jù)類型(如指針),其實就是深拷貝和淺拷貝的區(qū)別!一般類如果包含指針或引用成員,應(yīng)該遵守Rule of Three原則。

@24K純開源 指出的三法則:
三法則(英語:rule of three,the Law of The Big Three,The Big Three;三法則,三大定律)在 C++ 程序設(shè)計里,它是一個以設(shè)計的基本原則而制定的定律,三法則的要求在于,假如類型有明顯地定義下列其中一個成員函數(shù),那么程序員必須連其他二個成員函數(shù)也一同編寫至類型內(nèi),亦即下列三個成員函數(shù)缺一不可。

析構(gòu)函數(shù)(Destructor

復(fù)制構(gòu)造函數(shù)(copy constructor

復(fù)制賦值運算符(copy assignment operator

到此這篇關(guān)于C++拷貝構(gòu)造函數(shù)中的陷阱的文章就介紹到這了,更多相關(guān)拷貝構(gòu)造函數(shù)陷阱內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • VC++中HTControl控件類的CHTSlider控制桿控件類簡介

    VC++中HTControl控件類的CHTSlider控制桿控件類簡介

    這篇文章主要介紹了VC++中HTControl控件類的CHTSlider控制桿控件類,需要的朋友可以參考下
    2014-08-08
  • C語言Make命令用法講解

    C語言Make命令用法講解

    本文詳細(xì)講解了C語言Make命令用法,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-01-01
  • 簡單掌握C++中的函數(shù)模板

    簡單掌握C++中的函數(shù)模板

    這篇文章主要介紹了C++中的函數(shù)模板,包括函數(shù)模板的聲明和生成以及異常處理等基本知識,需要的朋友可以參考下
    2016-04-04
  • Opencv3.4.0實現(xiàn)視頻中的幀保存為圖片功能

    Opencv3.4.0實現(xiàn)視頻中的幀保存為圖片功能

    這篇文章主要為大家詳細(xì)介紹了Opencv3.4.0實現(xiàn)視頻中的幀保存為圖片功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-05-05
  • VC++ 中ListCtrl經(jīng)驗總結(jié)

    VC++ 中ListCtrl經(jīng)驗總結(jié)

    這篇文章主要介紹了VC++ 中ListCtrl經(jīng)驗總結(jié)的相關(guān)資料,需要的朋友可以參考下
    2015-06-06
  • C語言實現(xiàn)三子棋(井字棋)算法

    C語言實現(xiàn)三子棋(井字棋)算法

    這篇文章主要為大家詳細(xì)介紹了C語言實現(xiàn)三子棋(井字棋)算法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • c++中為什么不提倡使用vector示例詳解

    c++中為什么不提倡使用vector示例詳解

    這篇文章主要給大家介紹了關(guān)于c++中為什么不提倡使用vector的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用c++具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08
  • 超詳細(xì)VScode調(diào)試教程tasks.json和launch.json的設(shè)置

    超詳細(xì)VScode調(diào)試教程tasks.json和launch.json的設(shè)置

    vscode是一個輕量級的文本編輯器,但是它的擴展插件可以讓他拓展成功能齊全的IDE,這其中就靠的是tasks.json和launch.json的配置,下面這篇文章主要給大家介紹了關(guān)于超詳細(xì)VScode調(diào)試教程tasks.json和launch.json設(shè)置的相關(guān)資料,需要的朋友可以參考下
    2022-10-10
  • 詳解C++泛型裝飾器

    詳解C++泛型裝飾器

    這篇文章主要為大家介紹了C++的泛型裝飾器,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2021-11-11
  • 淺談C++對象的內(nèi)存分布和虛函數(shù)表

    淺談C++對象的內(nèi)存分布和虛函數(shù)表

    下面小編就為大家?guī)硪黄獪\談C++對象的內(nèi)存分布和虛函數(shù)表。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-12-12

最新評論