中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C++拷貝構造函數中的陷阱怎么解決

發布時間:2022-01-06 14:32:28 來源:億速云 閱讀:134 作者:iii 欄目:開發技術

這篇文章主要講解了“C++拷貝構造函數中的陷阱怎么解決”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“C++拷貝構造函數中的陷阱怎么解決”吧!

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

#include<iostream>
using namespace std;
class CExample
{
public:
int a,b,c;
char *str;
public:
//構造函數
    CExample(int tb)
    {
        a = tb;
        b = tb+1;
        c = tb+2;
        str=(char *)malloc(sizeof(char)*10);
strcpy(str,"123456789");
cout<<"creat: "<<endl;
    }
 
//析構函數
    ~CExample()
    {
cout<< "delete: "<<endl;
    }
void Show ()
{
cout<<a<<endl;
    }
//拷貝構造
//CExample(const CExample& C)
//{
//    str=(char *)malloc(sizeof(char)*10);
//    strcpy(str,C.str);
//    cout<<"copy"<<endl;
//}
};
//全局函數,傳入的是對象
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;
}

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

咱們先了解一下系統默認的拷貝構造函數,因為類中沒有寫自己的拷貝構造函數,所以調用的是默認的拷貝構造函數。

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

對于比較復雜的類型,編譯器就會自動生成一個缺省的拷貝構造函數。

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

這就是一個簡單結構的類,位拷貝,就是按對象在內存中的二進制進行拷貝,對于不涉及指針等類型的時候,位拷貝是比較不錯的拷貝方法。

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

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

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

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

答案是用戶自定義拷貝構造函數!

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

這樣就可以正確完成拷貝構造的操作了。

總結:對于簡單的數據類型,可以使用系統默認的拷貝構造函數;但對于復雜的數據類型(如指針),其實就是深拷貝和淺拷貝的區別!一般類如果包含指針或引用成員,應該遵守Rule of Three原則。

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

析構函數(Destructor

復制構造函數(copy constructor

復制賦值運算符(copy assignment operator

感謝各位的閱讀,以上就是“C++拷貝構造函數中的陷阱怎么解決”的內容了,經過本文的學習后,相信大家對C++拷貝構造函數中的陷阱怎么解決這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

c++
AI

青田县| 梁河县| 新宁县| 镇原县| 安西县| 麻栗坡县| 旬阳县| 雷山县| 普格县| 平潭县| 浪卡子县| 咸丰县| 昌宁县| 班玛县| 莆田市| 青田县| 郧西县| 乡城县| 尼玛县| 龙门县| 资中县| 亳州市| 汉沽区| 文山县| 凌源市| 毕节市| 建德市| 禄丰县| 鸡东县| 黎平县| 南投市| 云梦县| 溧水县| 太仓市| 潍坊市| 梁山县| 新兴县| 东安县| 天峨县| 明光市| 青州市|