復制控制

  復制構造函數賦值操作符析構函數總稱為復制控制。編譯器自動實現這些操作,但類也可以定義自己的版本。

  實現復制控制操作最困難的部分,往往在于識別何時需要覆蓋默認版本。有一種特別常見的情況需要類定義自己的復制控制成員:類具有指針成員。

一、復制構造函數

  特點:只有單個形參;該形參是對本類型對象的引用(const T&)。

  復制構造函數可以用于:

  1. 根據另一個同類型的對象顯式或隱式地初始化一個對象。

  2. 復制一個對象,將它作為實參傳給一個函數。

  3. 從函數返回時復制一個對象。

  4. 初始化順序容器中的元素。

  5. 根據元素初始化式列表初始化數組元素。

1.1、初始化:復制初始化和直接初始化

  int i(1024); ? ? ?//direct initialization.

? ? ? int a = 1024; ? //copy initialization.

  兩者之間的不同:

  直接初始化直接調用與實參匹配的構造函數;復制初始化總是調用復制構造函數。復制初始化首先使用指定構造函數創建一個臨時對象,然后用復制構造函數將那個臨時對象復制到正在創建的對象:

  string null_book = "aaaaaaaaaa"; ? ? ? ? ? //copy initialization

  string dot(10, '.'); ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //direct initialization

  string empty_copy = string(); ? ? ? ? ? ? ? //copy

  string empty_direct; ? ? ? ? ? ? ? ? ? ? ? ? ? ? //direct

1.2、形參與返回值

  正如我們所知,當形參為非飲用類型的時候,將復制實參的值。類似地,以非引用類型作為返回值時,將返回return語句中的副本。

  當形參或返回值為類類型時,由復制構造函數進行復制。當形參或返回值為類型引用時,不能復制。如:

? ? ? //copy constructor used to copy the return value.

? ? ? //parameters are references, so they aren't copied.

  string make(size_t, const string&, const string&);

1.3、合成的復制構造函數

  如果我們沒有定義復制構造函數,編譯器就會為我們合成一個。

  與合成的默認構造函數不同,即使我們定義了其他構造函數,也會合成復制構造函數。合成復制構造函數的行為是:執行逐個成員(非static 成員)初始化,將對新對象初始化為原對象的副本

  例如:

class Sales_item {
private:str::string isbn;int sold;double revenue;
}合成復制構造函數如下:Sales_item::Sales_item(const Sales_item&obj)
{isbn(obj.isbn);            //uses string copy construtor
    sold(obj.sold);revenue(obj.revenue);
}

?

二、禁止復制

  有的類需要完全禁止復制。例如:iostream類。

  如果復制構造函數是private的,將不會允許用戶代碼復制該類類型的對象,編譯器將拒絕任何進行復制的嘗試。

  然而,友元和成員仍可以進行復制。如果想要連友元和成員中的復制也禁止,就可以聲明一個private復制構造函數但不對其定義

這是因為:聲明而不定義成員函數是合法的,但是,使用未定義的成員的任何嘗試將導致鏈接失敗。

?

轉載于:https://www.cnblogs.com/wiessharling/p/3346112.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/376374.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/376374.shtml
英文地址,請注明出處:http://en.pswp.cn/news/376374.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

python Requests登錄GitHub

工具: python 3.6 Fiddler4 所需要的庫: requests BeautifulSoup 首先抓包,觀察登錄時需要什么: 這個authenticity_token的值是訪問/login后可以獲取,值是隨機生成的,所以登錄前要獲取一下。 注…

你必須懂的 T4 模板:深入淺出

示例代碼:示例代碼__你必須懂的T4模板:淺入深出.rar (一)什么是T4模板? T4,即4個T開頭的英文字母組合:Text Template Transformation Toolkit。 T4文本模板,即一種自定義規則的代碼生成器。根據業務模型可生…

stdafx.h是什么用處, stdafx.h、stdafx.cpp的作用

http://blog.csdn.net/songkexin/article/details/1750396 stdafx.h頭文件的作用 Standard Application Fram Extend沒有函數庫,只是定義了一些環境參數,使得編譯出來的程序能在32位的操作系統環境下運行。Windows和MFC的include文件都非常大&#xff0c…

python3 Connection aborted.', RemoteDisconnected('Remote end closed connection without response'

在寫爬蟲的時候遇到了問題,網站是asp.net寫的 requests.exceptions.ConnectionError: (Connection aborted., RemoteDisconnected(Remote end closed connection without response,)) 于是就抓包分析,發現只要加了’Accept-Language’就好了。。。 A…

id和instancetype的區別

id返回不確定類型的對象(也就是任意類型的對象),- (id)arrayWithData;返回的就是不確定類型的對象,如果執行數組的方法, [- (id)arrayWithData objectOfIndex:0]編譯時不會報錯,但運行時會報錯,…

windows下Java 用idea連接MySQL數據庫

Java用idea連接數據庫特別簡單。 首先就是下載好MySQL數據庫的驅動程序。 鏈接:https://dev.mysql.com/downloads/connector/j/ 然后就是選下載版本了: 選個zip格式的嘛。。 下載完后就解壓。打開idea,建立個簡單的項目 找到這個: …

7-2

#include<stdio.h> int main(void) {int i;int fib[10]{1,1};for(i2;i<10;i)fib[i]fib[i-1]fib[i-2];for(i0;i<10;i){printf("%6d",fib[i]);if((i1)%50)printf("\n");}return 0; } 轉載于:https://www.cnblogs.com/liruijia199531/p/3357481.h…

歲月悄然前行,沒有停留的痕跡

歲月悄然前行&#xff0c;沒有停留的痕跡。月落烏啼&#xff0c;總是千年的風霜;濤聲依舊&#xff0c;不見當初的夜晚。走過歲月的痕跡&#xff0c;已是物是人非。我們在歲月的軌道上行走&#xff0c;不要給歲月太多的裝飾&#xff0c;不要給歲月太多的言語。給它我們隨著時光追…

160 - 41 defiler.1.exe

環境&#xff1a; Windows xp sp3 工具&#xff1a; Ollydbg stud_PE LoadPE 先分析一下。 這次的程序要求更改了&#xff0c;變成了這個&#xff1a; defilers reversme no.1 -----------------------The task of this little, lame reverseme is to add some code to…

HDU-2112 HDU Today

http://acm.hdu.edu.cn/showproblem.php?pid2112 怎樣把具體的字母的地點轉換為數字的函數為題目的重點。 HDU Today Time Limit: 15000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 11385 Accepted Submission(s): 2663 P…

AndEngine引擎之SmoothCamera 平滑攝像機

SmoothCamera:就相當于現實世界的攝像機&#xff0c;要想照到一個物體&#xff0c;要么是攝像機移動&#xff0c;要么是物體移動到攝像頭的范圍內&#xff0c;想要放大或縮小一個物體&#xff0c;要么是物體向前或向后移動&#xff0c;要么是攝像頭變焦 這里討論的就是攝像頭的…

160 - 44 defiler.1.exe

環境&#xff1a; Windows xp sp3 工具&#xff1a; 1.ollydbg 2.exeinfope 0x00 查殼 無殼就下一步 0x01 分析 隨便輸入個錯的&#xff0c;出現了不知道哪國的語言。有個6&#xff0c;應該就是name的長度要大于6吧 OD載入&#xff0c;搜字符串。 00421BD7 |. 807D…

時間與日期處理

主要有以下類&#xff1a; NSDate -- 表示一個絕對的時間點NSTimeZone -- 時區信息NSLocale -- 本地化信息NSDateComponents -- 一個封裝了具體年月日、時秒分、周、季度等的類NSCalendar -- 日歷類&#xff0c;它提供了大部分的日期計算接口&#xff0c;并且允許您在NSDate和N…

C++ new/new operator、operator new、placement new初識

簡要釋義 1.operator new是內存分配函數&#xff08;同malloc&#xff09;&#xff0c;C&#xff0b;&#xff0b;在全局作用域(global scope)內提供了3份默認的operator new實現&#xff0c;并且用戶可以重載operator new。 1 void* operator new(std::size_t) throw(std::bad…

160 - 45 Dope2112.2

環境&#xff1a; Windows xp sp3 工具 1.ollydbg 2.exeinfope 0x00 查殼 還是無殼的Delphi程序 0x01 分析 這次繼續OD載入搜字符串&#xff0c;但是沒找到錯誤信息的字符串。 又因為是Delphi程序&#xff0c;所以可以試一下這樣&#xff1a; OD載入后還是搜字符串&…

編輯技巧 word

怎樣給word中的文檔加上水印 轉載于:https://www.cnblogs.com/dqxu/p/4208372.html

NAT地址轉換原理全攻略

NAT轉換方式及原理 在NAT的應用中&#xff0c;可以僅需要轉換內部地址&#xff08;就是“內部本地址”轉換成“內部全局地址”&#xff09;&#xff0c;這是最典型的應用&#xff0c;如內部網絡用戶通過NAT轉換共享上網&#xff1b;也可以是僅需要轉換外部地址&#xff08;就是…

通過setTimeout來取消因大量計算造成的網頁卡頓

js是單線程的&#xff0c;所以有些大量計算的操作會占用線程資源&#xff0c;導致頁面卡住。 今天遇到這樣一個場景&#xff0c;選擇一個下拉框之后&#xff0c;對數據進行篩選&#xff0c;這個過程中有大量計算&#xff0c;點了selecte的option之后&#xff0c;option不隱藏&a…

160 - 47 DueList.2

環境&#xff1a; Windows xp sp3 工具&#xff1a; Ollydbg exeinfope 0x00 查殼 無殼的程序 0x01 分析 運行后說需要keyfile&#xff0c;那就創建一個。 OD載入找找看需要的keyfile叫什么名字 00401000 > $ 6A 00 push 0x0 …

如何解決Visual Studio2012 與此版本的Windows不兼容

解決方案&#xff1a; http://www.microsoft.com/zh-CN/download/details.aspx?id36020 下載更新轉載于:https://www.cnblogs.com/awodefeng/p/3373343.html