亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

詳解C++ 拷貝構(gòu)造函數(shù)

 更新時(shí)間:2020年07月09日 11:36:54   作者:菜鳥教程  
這篇文章主要介紹了C++ 拷貝構(gòu)造函數(shù)的相關(guān)資料,文中示例代碼非常詳細(xì),幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下

拷貝構(gòu)造函數(shù)是一種特殊的構(gòu)造函數(shù),它在創(chuàng)建對(duì)象時(shí),是使用同一類中之前創(chuàng)建的對(duì)象來初始化新創(chuàng)建的對(duì)象。拷貝構(gòu)造函數(shù)通常用于:

  • 通過使用另一個(gè)同類型的對(duì)象來初始化新創(chuàng)建的對(duì)象。
  • 復(fù)制對(duì)象把它作為參數(shù)傳遞給函數(shù)。
  • 復(fù)制對(duì)象,并從函數(shù)返回這個(gè)對(duì)象。

如果在類中沒有定義拷貝構(gòu)造函數(shù),編譯器會(huì)自行定義一個(gè)。如果類帶有指針變量,并有動(dòng)態(tài)內(nèi)存分配,則它必須有一個(gè)拷貝構(gòu)造函數(shù)??截悩?gòu)造函數(shù)的最常見形式如下:

classname (const classname &obj) {
  // 構(gòu)造函數(shù)的主體
}

在這里,obj 是一個(gè)對(duì)象引用,該對(duì)象是用于初始化另一個(gè)對(duì)象的。

#include <iostream>
 
using namespace std;
 
class Line
{
  public:
   int getLength( void );
   Line( int len );       // 簡(jiǎn)單的構(gòu)造函數(shù)
   Line( const Line &obj);   // 拷貝構(gòu)造函數(shù)
   ~Line();           // 析構(gòu)函數(shù)
 
  private:
   int *ptr;
};
 
// 成員函數(shù)定義,包括構(gòu)造函數(shù)
Line::Line(int len)
{
  cout << "調(diào)用構(gòu)造函數(shù)" << endl;
  // 為指針分配內(nèi)存
  ptr = new int;
  *ptr = len;
}
 
Line::Line(const Line &obj)
{
  cout << "調(diào)用拷貝構(gòu)造函數(shù)并為指針 ptr 分配內(nèi)存" << endl;
  ptr = new int;
  *ptr = *obj.ptr; // 拷貝值
}
 
Line::~Line(void)
{
  cout << "釋放內(nèi)存" << endl;
  delete ptr;
}
int Line::getLength( void )
{
  return *ptr;
}
 
void display(Line obj)
{
  cout << "line 大小 : " << obj.getLength() <<endl;
}
 
// 程序的主函數(shù)
int main( )
{
  Line line(10);
 
  display(line);
 
  return 0;
}

當(dāng)上面的代碼被編譯和執(zhí)行時(shí),它會(huì)產(chǎn)生下列結(jié)果:

調(diào)用構(gòu)造函數(shù)
調(diào)用拷貝構(gòu)造函數(shù)并為指針 ptr 分配內(nèi)存
line 大小 : 10
釋放內(nèi)存
釋放內(nèi)存

下面的實(shí)例對(duì)上面的實(shí)例稍作修改,通過使用已有的同類型的對(duì)象來初始化新創(chuàng)建的對(duì)象:

#include <iostream>
 
using namespace std;
 
class Line
{
  public:
   int getLength( void );
   Line( int len );       // 簡(jiǎn)單的構(gòu)造函數(shù)
   Line( const Line &obj);   // 拷貝構(gòu)造函數(shù)
   ~Line();           // 析構(gòu)函數(shù)
 
  private:
   int *ptr;
};
 
// 成員函數(shù)定義,包括構(gòu)造函數(shù)
Line::Line(int len)
{
  cout << "調(diào)用構(gòu)造函數(shù)" << endl;
  // 為指針分配內(nèi)存
  ptr = new int;
  *ptr = len;
}
 
Line::Line(const Line &obj)
{
  cout << "調(diào)用拷貝構(gòu)造函數(shù)并為指針 ptr 分配內(nèi)存" << endl;
  ptr = new int;
  *ptr = *obj.ptr; // 拷貝值
}
 
Line::~Line(void)
{
  cout << "釋放內(nèi)存" << endl;
  delete ptr;
}
int Line::getLength( void )
{
  return *ptr;
}
 
void display(Line obj)
{
  cout << "line 大小 : " << obj.getLength() <<endl;
}
 
// 程序的主函數(shù)
int main( )
{
  Line line1(10);
 
  Line line2 = line1; // 這里也調(diào)用了拷貝構(gòu)造函數(shù)
 
  display(line1);
  display(line2);
 
  return 0;
}

當(dāng)上面的代碼被編譯和執(zhí)行時(shí),它會(huì)產(chǎn)生下列結(jié)果:

調(diào)用構(gòu)造函數(shù)
調(diào)用拷貝構(gòu)造函數(shù)并為指針 ptr 分配內(nèi)存
調(diào)用拷貝構(gòu)造函數(shù)并為指針 ptr 分配內(nèi)存
line 大小 : 10
釋放內(nèi)存
調(diào)用拷貝構(gòu)造函數(shù)并為指針 ptr 分配內(nèi)存
line 大小 : 10
釋放內(nèi)存
釋放內(nèi)存
釋放內(nèi)存

關(guān)于為什么當(dāng)類成員中含有指針類型成員且需要對(duì)其分配內(nèi)存時(shí),一定要有總定義拷貝構(gòu)造函數(shù)??

默認(rèn)的拷貝構(gòu)造函數(shù)實(shí)現(xiàn)的只能是淺拷貝,即直接將原對(duì)象的數(shù)據(jù)成員值依次復(fù)制給新對(duì)象中對(duì)應(yīng)的數(shù)據(jù)成員,并沒有為新對(duì)象另外分配內(nèi)存資源。

這樣,如果對(duì)象的數(shù)據(jù)成員是指針,兩個(gè)指針對(duì)象實(shí)際上指向的是同一塊內(nèi)存空間。

在某些情況下,淺拷貝回帶來數(shù)據(jù)安全方面的隱患。

當(dāng)類的數(shù)據(jù)成員中有指針類型時(shí),我們就必須定義一個(gè)特定的拷貝構(gòu)造函數(shù),該拷貝構(gòu)造函數(shù)不僅可以實(shí)現(xiàn)原對(duì)象和新對(duì)象之間數(shù)據(jù)成員的拷貝,而且可以為新的對(duì)象分配單獨(dú)的內(nèi)存資源,這就是深拷貝構(gòu)造函數(shù)。

如何防止默認(rèn)拷貝發(fā)生

聲明一個(gè)私有的拷貝構(gòu)造函數(shù),這樣因?yàn)榭截悩?gòu)造函數(shù)是私有的,如果用戶試圖按值傳遞或函數(shù)返回該類的對(duì)象,編譯器會(huì)報(bào)告錯(cuò)誤,從而可以避免按值傳遞或返回對(duì)象。

總結(jié):

當(dāng)出現(xiàn)類的等號(hào)賦值時(shí),會(huì)調(diào)用拷貝函數(shù),在未定義顯示拷貝構(gòu)造函數(shù)的情況下,系統(tǒng)會(huì)調(diào)用默認(rèn)的拷貝函數(shù)——即淺拷貝,它能夠完成成員的一一復(fù)制。當(dāng)數(shù)據(jù)成員中沒有指針時(shí),淺拷貝是可行的。但當(dāng)數(shù)據(jù)成員中有指針時(shí),如果采用簡(jiǎn)單的淺拷貝,則兩類中的兩個(gè)指針將指向同一個(gè)地址,當(dāng)對(duì)象快結(jié)束時(shí),會(huì)調(diào)用兩次析構(gòu)函數(shù),而導(dǎo)致指針懸掛現(xiàn)象。所以,這時(shí),必須采用深拷貝。

深拷貝與淺拷貝的區(qū)別就在于深拷貝會(huì)在堆內(nèi)存中另外申請(qǐng)空間來儲(chǔ)存數(shù)據(jù),從而也就解決了指針懸掛的問題。簡(jiǎn)而言之,當(dāng)數(shù)據(jù)成員中有指針時(shí),必須要用深拷貝。

以上就是詳解C++ 拷貝構(gòu)造函數(shù)的詳細(xì)內(nèi)容,更多關(guān)于C++ 拷貝構(gòu)造函數(shù)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • C++中的extern聲明變量詳解

    C++中的extern聲明變量詳解

    這篇文章主要介紹了C++中的extern聲明變量詳解,本文講解了聲明和定義、extern聲明全局變量、extern聲明函數(shù)等內(nèi)容,需要的朋友可以參考下
    2015-03-03
  • C++ vector的基本使用示例詳解

    C++ vector的基本使用示例詳解

    這篇文章主要介紹了C++ vector的基本使用,本文通過示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-03-03
  • C++超詳細(xì)分析講解內(nèi)聯(lián)函數(shù)

    C++超詳細(xì)分析講解內(nèi)聯(lián)函數(shù)

    為了消除函數(shù)調(diào)用的時(shí)空開銷,C++ 提供一種提高效率的方法,即在編譯時(shí)將函數(shù)調(diào)用處用函數(shù)體替換,類似于C語(yǔ)言中的宏展開。這種在函數(shù)調(diào)用處直接嵌入函數(shù)體的函數(shù)稱為內(nèi)聯(lián)函數(shù)(Inline Function),又稱內(nèi)嵌函數(shù)或者內(nèi)置函數(shù)
    2022-06-06
  • C語(yǔ)言之system函數(shù)案例詳解

    C語(yǔ)言之system函數(shù)案例詳解

    這篇文章主要介紹了C語(yǔ)言之system函數(shù)案例詳解,本篇文章通過簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • 賭你會(huì)懵的C語(yǔ)言指針進(jìn)階數(shù)組場(chǎng)景解析

    賭你會(huì)懵的C語(yǔ)言指針進(jìn)階數(shù)組場(chǎng)景解析

    這篇文章主要為大家介紹了關(guān)于C語(yǔ)言指針進(jìn)階的示例解析,來細(xì)化指針這一部分內(nèi)容,現(xiàn)在著重把一些指針的運(yùn)用情景搬出來康康,如果對(duì)指針盤的不是非常熟練,或者指針還出于入門階段的鐵子請(qǐng)繞道
    2022-02-02
  • 詳解圖的應(yīng)用(最小生成樹、拓?fù)渑判?、關(guān)鍵路徑、最短路徑)

    詳解圖的應(yīng)用(最小生成樹、拓?fù)渑判?、關(guān)鍵路徑、最短路徑)

    這篇文章主要介紹了圖的應(yīng)用(最小生成樹、拓?fù)渑判?、關(guān)鍵路徑、最短路徑),需要的朋友可以參考下
    2015-08-08
  • C++中綴表達(dá)式轉(zhuǎn)后綴表達(dá)式的方法

    C++中綴表達(dá)式轉(zhuǎn)后綴表達(dá)式的方法

    這篇文章主要介紹了C++中綴表達(dá)式轉(zhuǎn)后綴表達(dá)式的方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-04-04
  • c語(yǔ)言實(shí)現(xiàn)含遞歸清場(chǎng)版掃雷游戲

    c語(yǔ)言實(shí)現(xiàn)含遞歸清場(chǎng)版掃雷游戲

    掃雷大家應(yīng)該都玩過,這是一個(gè)十分經(jīng)典的游戲,下面這篇文章主要給大家介紹了關(guān)于c語(yǔ)言實(shí)現(xiàn)含遞歸清場(chǎng)版掃雷游戲的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2021-11-11
  • c++??復(fù)制消除問題解決示例詳析

    c++??復(fù)制消除問題解決示例詳析

    這篇文章主要為大家介紹了c++??復(fù)制消除問題解決示例詳析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-08-08
  • C語(yǔ)言基于EasyX庫(kù)實(shí)現(xiàn)有圖形界面時(shí)鐘

    C語(yǔ)言基于EasyX庫(kù)實(shí)現(xiàn)有圖形界面時(shí)鐘

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言基于EasyX庫(kù)實(shí)現(xiàn)有圖形界面時(shí)鐘,獲得本地時(shí)間,輸出文字,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03

最新評(píng)論