国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C++ > 正文

舉例說明C++中拷貝構造函數

2020-02-24 14:24:57
字體:
來源:轉載
供稿:網友

在C++中,復制并沒有脫離其原有的意義,而是“專用”是指用現有對象創建一個新對象,下面武林技術頻道小編就給大家舉例說明C++中拷貝構造函數吧!

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

2.拷貝構造函數的形式

?

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


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

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

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

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

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

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

?

下面舉個深拷貝的例子。

?

#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.拷貝構造函數與“=“賦值運算符
例如:

?

?

?


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


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

以上就是舉例說明C++中拷貝構造函數,其實js.Vevb.com就是不錯的選擇,學習的方法有很多,小伙伴們可以通過武林技術頻道來詳加了解哦。

?

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 东乌珠穆沁旗| 安义县| 稷山县| 苍山县| 罗源县| 合阳县| 翁牛特旗| 雅安市| 江西省| 南城县| 秀山| 乌兰县| 涿州市| 木兰县| 交口县| 永德县| 闻喜县| 徐水县| 上虞市| 东安县| 勐海县| 若尔盖县| 芒康县| 若尔盖县| 怀化市| 连江县| 临海市| 红安县| 陇川县| 临海市| 收藏| 渑池县| 吴川市| 北票市| 崇阳县| 磴口县| 左云县| 许昌县| 沙河市| 福泉市| 芒康县|