一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - C/C++ - c++拷貝構造函數防篡改示例

c++拷貝構造函數防篡改示例

2021-01-18 10:28C++教程網 C/C++

這篇文章主要介紹了拷貝構造函數防篡改示例,需要的朋友可以參考下

對于普通類型的對象來說,他們之間的復制是簡單的,比如:

復制代碼 代碼如下:

int a = 88;
int b = a;

 

而類和普通對象不同,類對象內部結構一般較為復雜,存在各種成員變量。

復制代碼 代碼如下:


#include <iostream>
using namespace std;

 

class CExample {
private:
 int a;
public:
     CExample(int b)
 { a=b;}
 void Show ()
 {
        cout<<a<<endl;
    }
};

int main()
{
     CExample A(100);
     CExample B=A;
     B.Show ();
 return 0;
}

 

運行程序,屏幕輸出100。從以上代碼運行結果可以看出,系統為B分配了內存并完成了對象A的復制過程。

就對象而言,相同類型的對象是通過拷貝構造函數來完成整個復制過程的。

復制代碼 代碼如下:

CExample(const CExample& C)
 {
        a=C.a;
 }
 

 

CExample(const CExample& C)就是我們自定義的拷貝構造函數。可見,拷貝構造函數是一種特殊的構造函數,函數的名稱必須和類名稱一致,它的唯一的一個參數是本類型的一個引用變量,該參數是const類型,不可變的。例如:類X的拷貝構造函數的形式為X(X& x)。

當用一個已初始化過了的自定義類類型對象去初始化另一個新構造的對象的時候,拷貝構造函數就會被自動調用。也就是說,當類的對象需要拷貝時,拷貝構造函數將會被調用。以下情況都會調用拷貝構造函數:
一個對象以值傳遞的方式傳入函數體
一個對象以值傳遞的方式從函數返回
一個對象需要通過另外一個對象進行初始化。

如果在類中沒有顯式地聲明一個拷貝構造函數,那么,編譯器將會自動生成一個默認的拷貝構造函數,該構造函數完成對象之間的位拷貝。位拷貝又稱淺拷貝,后面將進行說明。

自定義拷貝構造函數是一種良好的編程風格,它可以阻止編譯器形成默認的拷貝構造函數,提高源碼效率。

淺拷貝和深拷貝

在某些狀況下,類內成員變量需要動態開辟堆內存,如果實行位拷貝,也就是把對象里的值完全復制給另一個對象,如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;
}

 

延伸 · 閱讀

精彩推薦
  • C/C++詳解c語言中的 strcpy和strncpy字符串函數使用

    詳解c語言中的 strcpy和strncpy字符串函數使用

    strcpy 和strcnpy函數是字符串復制函數。接下來通過本文給大家介紹c語言中的strcpy和strncpy字符串函數使用,感興趣的朋友跟隨小編要求看看吧...

    spring-go5642021-07-02
  • C/C++深入理解goto語句的替代實現方式分析

    深入理解goto語句的替代實現方式分析

    本篇文章是對goto語句的替代實現方式進行了詳細的分析介紹,需要的朋友參考下...

    C語言教程網7342020-12-03
  • C/C++c++ 單線程實現同時監聽多個端口

    c++ 單線程實現同時監聽多個端口

    這篇文章主要介紹了c++ 單線程實現同時監聽多個端口的方法,幫助大家更好的理解和學習使用c++,感興趣的朋友可以了解下...

    源之緣11542021-10-27
  • C/C++C++之重載 重定義與重寫用法詳解

    C++之重載 重定義與重寫用法詳解

    這篇文章主要介紹了C++之重載 重定義與重寫用法詳解,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下...

    青山的青6062022-01-04
  • C/C++學習C++編程的必備軟件

    學習C++編程的必備軟件

    本文給大家分享的是作者在學習使用C++進行編程的時候所用到的一些常用的軟件,這里推薦給大家...

    謝恩銘10102021-05-08
  • C/C++C語言中炫酷的文件操作實例詳解

    C語言中炫酷的文件操作實例詳解

    內存中的數據都是暫時的,當程序結束時,它們都將丟失,為了永久性的保存大量的數據,C語言提供了對文件的操作,這篇文章主要給大家介紹了關于C語言中文件...

    針眼_6702022-01-24
  • C/C++C/C++經典實例之模擬計算器示例代碼

    C/C++經典實例之模擬計算器示例代碼

    最近在看到的一個需求,本以為比較簡單,但花了不少時間,所以下面這篇文章主要給大家介紹了關于C/C++經典實例之模擬計算器的相關資料,文中通過示...

    jia150610152021-06-07
  • C/C++C語言實現電腦關機程序

    C語言實現電腦關機程序

    這篇文章主要為大家詳細介紹了C語言實現電腦關機程序,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    xiaocaidayong8482021-08-20
主站蜘蛛池模板: 5x社区在线观看直接进入 | 黄a在线观看 | 亚洲欧美日韩国产精品一区 | 亚洲欧美在线观看一区二区 | 免费高清在线 | 午夜国产精品影院在线观看 | 三叶草私人研究所 | 青青青国产在线观看 | 亚洲国产自 | 福利国产片 | 亚洲国产欧美另类va在线观看 | 欧美成人免费观看bbb | 小黄文污到你湿 | 美女用手扒开粉嫩的屁股 | 亚欧毛片基地国产毛片基地 | 日韩成人在线视频 | 国产普通话对白露脸流出 | 日韩免费在线看 | 亚洲福利天堂 | 蜜色影院| 免费看一级a一片毛片 | 亚飞与亚基国语1080p在线观看 | 欧美一级专区免费大片俄罗斯 | 俄罗斯美女尿尿 | 国产精品成人va在线观看 | 国产精品一区二区国产 | 国产在线视频第一页 | 精品视频一区二区观看 | 国产亚洲精品看片在线观看 | 亚洲www美色| 国内小情侣一二三区在线视频 | 色哟哟哟 | 美女黄金大片视频免费看 | 福利国产精品 | 俄罗斯图书馆无打码久久 | 亚洲视频一区在线播放 | 9re视频这里只有精品 | 女同全黄h全肉动漫 | 美女扒开腿让男人桶爽免费gif | 99精品免费在线观看 | miaa076深田咏美在线 |