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

C++中拷貝構造函數(shù)的總結詳解

 更新時間:2013年09月25日 09:17:37   作者:  
深拷貝和淺拷貝可以簡單理解為:如果一個類擁有資源,當這個類的對象發(fā)生復制過程的時候,資源重新分配,這個過程就是深拷貝,反之,沒有重新分配資源,就是淺拷貝

1.什么是拷貝構造函數(shù):
拷貝構造函數(shù)嘛,當然就是拷貝和構造了。(其實很多名字,只要靜下心來想一想,就真的是顧名思義呀)拷貝又稱復制,因此拷貝構造函數(shù)又稱復制構造函數(shù)。百度百科上是這樣說的:拷貝構造函數(shù),是一種特殊的構造函數(shù),它由編譯器調用來完成一些基于同一類的其他對象的構建及初始化。其唯一的參數(shù)(對象的引用)是不可變的(const類型)。此函數(shù)經常用在函數(shù)調用時用戶定義類型的值傳遞及返回。

2.拷貝構造函數(shù)的形式

復制代碼 代碼如下:

Class X
{
public:
  X();
  X(const X&);//拷貝構造函數(shù)
}

2.1為什么拷貝構造參數(shù)是引用類型?
其原因如下:當一個對象以傳遞值的方式傳一個函數(shù)的時候,拷貝構造函數(shù)自動被調用來生成函數(shù)中的對象(符合拷貝構造函數(shù)調用的情況)。如果一個對象是被傳入自己的拷貝構造函數(shù),它的拷貝構造函數(shù)將會被調用來拷貝這個對象,這樣復制才可以傳入它自己的拷貝構造函數(shù),這會導致無限循環(huán)直至棧溢出(Stack Overflow)。

3.拷貝構造函數(shù)調用的三種形式
3.1.一個對象作為函數(shù)參數(shù),以值傳遞的方式傳入函數(shù)體;
3.2.一個對象作為函數(shù)返回值,以值傳遞的方式從函數(shù)返回;
3.3.一個對象用于給另外一個對象進行初始化(常稱為復制初始化)。

總結:當某對象是按值傳遞時(無論是作為函數(shù)參數(shù),還是作為函數(shù)返回值),編譯器都會先建立一個此對象的臨時拷貝,而在建立該臨時拷貝時就會調用類的拷貝構造函數(shù)。

4.深拷貝和淺拷貝
如果在類中沒有顯式地聲明一個拷貝構造函數(shù),那么,編譯器將會自動生成一個默認的拷貝構造函數(shù),該構造函數(shù)完成對象之間的位拷貝。(位拷貝又稱淺拷貝,后面將進行說明。)自定義拷貝構造函數(shù)是一種良好的編程風格,它可以阻止編譯器形成默認的拷貝構造函數(shù),提高源碼效率。

在某些狀況下,類內成員變量需要動態(tài)開辟堆內存,如果實行位拷貝,也就是把對象里的值完全復制給另一個對象,如A=B。這時,如果B中有一個成員變量指針已經申請了內存,那A中的那個成員變量也指向同一塊內存。這就出現(xiàn)了問題:當B把內存釋放了(如:析構),這時A內的指針就是野指針了,出現(xiàn)運行錯誤。事實上這就要用到深拷貝了,要自定義拷貝構造函數(shù)。

深拷貝和淺拷貝可以簡單理解為:如果一個類擁有資源,當這個類的對象發(fā)生復制過程的時候,資源重新分配,這個過程就是深拷貝,反之,沒有重新分配資源,就是淺拷貝。

下面舉個深拷貝的例子。

復制代碼 代碼如下:

#include <iostream>
using namespace std;
class CA
{
public:
  CA(int b,char* cstr)
  {
    a=b;
     str=new char[b];
    strcpy(str,cstr);
  }
  CA(const CA& C)
  {
    a=C.a;
    str=new char[a]; //深拷貝
    if(str!=0)
     strcpy(str,C.str);
  }
  void Show()
  {
    cout<<str<<endl;
  }
  ~CA()
  {
    delete str;
  }
 private:
   int a;
   char *str;
};
int main()
{
  CA A(10,"Hello!");
  CA B=A;
  B.Show();
  return 0;
}

淺拷貝資源后在釋放資源的時候會產生資源歸屬不清的情況導致程序運行出錯。一定要注意類中是否存在指針成員。

5.拷貝構造函數(shù)與“=“賦值運算符
例如:
復制代碼 代碼如下:

class CExample
{};
int main()
{
CExample e1 = new CExample;
CExample e2 = e1;//調用拷貝構造函數(shù)
CExample e3(e1);//調用拷貝構造函數(shù)
CExample e4;
e4 = e1;//調用=賦值運算符
}

通常的原則是:①對于凡是包含動態(tài)分配成員或包含指針成員的類都應該提供拷貝構造函數(shù);②在提供拷貝構造函數(shù)的同時,還應該考慮重載"="賦值操作符號。

相關文章

  • C++編程之多態(tài)的使用

    C++編程之多態(tài)的使用

    這篇文章主要介紹了C++編程之多態(tài)的使用方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-06-06
  • C++ push方法與push_back方法常見方法介紹

    C++ push方法與push_back方法常見方法介紹

    push與push_back是STL中常見的方法,都是向數(shù)據(jù)結構中添加元素,本文還將簡述push對應的stack與queue系列,常見方法的介紹,以及與push_back相對應的vector系列常見方法介紹,感興趣的朋友跟隨小編一起看看吧
    2022-11-11
  • C++多繼承多態(tài)的實例詳解

    C++多繼承多態(tài)的實例詳解

    這篇文章主要介紹了C++多繼承多態(tài)的實例詳解的相關資料,需要的朋友可以參考下
    2017-06-06
  • C++17使用std::optional表示可能存在的值

    C++17使用std::optional表示可能存在的值

    本文主要介紹了C++17使用std::optional表示可能存在的值,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-07-07
  • C語言實現(xiàn)餐飲管理系統(tǒng)

    C語言實現(xiàn)餐飲管理系統(tǒng)

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)餐飲管理系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • C++超詳細講解引用和指針

    C++超詳細講解引用和指針

    引用是C++一個很重要的特性,顧名思義是某一個變量或對象的別名,對引用的操作與對其所綁定的變量或對象的操作完全等價,這篇文章主要給大家總結介紹了C++中引用的相關知識點,需要的朋友可以參考下
    2022-06-06
  • C/C++使用fmt庫實現(xiàn)格式化字符串

    C/C++使用fmt庫實現(xiàn)格式化字符串

    fmt庫是一個高效、易用的C++格式化庫,可以幫助我們方便地進行字符串格式化、輸出、日志記錄等操作,下面我們就來學習一下fmt格式化字符串的具體操作吧
    2023-12-12
  • C/C++內存管理之new與delete的使用及原理解析

    C/C++內存管理之new與delete的使用及原理解析

    這篇文章主要介紹了C/C++內存管理之new與delete的使用及原理解析,本文通過實例代碼圖文相結合給大家介紹的非常詳細,感興趣的朋友跟隨小編一起看看吧
    2024-08-08
  • 詳解C語言中return與exit的區(qū)別

    詳解C語言中return與exit的區(qū)別

    這篇文章主要介紹了詳解C語言中return與exit的區(qū)別的相關資料,希望通過本文能幫助到大家,讓大家理解這部分內容,需要的朋友可以參考下
    2017-10-10
  • C語言柔性數(shù)組的實現(xiàn)示例

    C語言柔性數(shù)組的實現(xiàn)示例

    柔性數(shù)組既數(shù)組大小待定的數(shù)組, C語言中結構體的最后一個元素可以是大小未知的數(shù)組,本文就來介紹一下柔性數(shù)組的用法,感興趣的可以了解一下
    2024-03-03

最新評論