C 第十七天 複製控制

2021-06-23 01:14:03 字數 1923 閱讀 7009

/*

複製控制:複製建構函式、賦值操作符和析構函式。

複製建構函式:是一種特殊建構函式,具有單個形參,該形參(常用const修飾)是對該類型別的引用。當定義乙個物件並用乙個同型別的物件對它進行初始化時,將顯示使用複製建構函式。當將該型別的物件傳遞給函式或從函式返回該型別的物件時,將隱式使用複製建構函式

析構函式:是建構函式的互補:當物件超出作用域或動態分配的物件被刪除時,將自動應用析構函式。析構函式可用於釋放物件時構造或在物件的生命期中所獲取的資源。不管類是否定義了自己的析構函式,編譯器都自動指向類中非static資料成員的析構函式。

(需要類定義自己的複製控制成員的:類具有指標成員)

複製建構函式可用於:

1.根據另乙個同型別的物件顯式或隱式初始化乙個物件。

2.複製乙個物件,將它作為實參傳給乙個函式。

3.從函式返回時複製乙個物件。

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

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

定義形式:

直接初始化(使用括號()初始化)和複製初始化(使用=號初始化)

合成的複製建構函式:合成複製建構函式的行為是,執行逐個成員初始化,將新物件初始化為原物件的副本。

(逐個成員是值編譯器將現有物件的每個非static成員,依次複製到正建立的物件)

合成複製建構函式直接複製內建型別成員的值,類型別成員使用該類的複製建構函式進行複製。如果乙個類具有陣列成員,則合成複製建構函式將複製陣列,複製陣列的每乙個元素。

定義自己的複製建構函式:

複製建構函式就是接受單個類型別引用形參(通常用const修飾)的複製建構函式。例如:

class foo;

因為用於向函式傳遞物件和從函式返回物件,該建構函式一般不應設定為explicit(抑制隱式轉換)

禁止複製:為了防止複製,類必須顯示宣告其複製建構函式為private。

如果想要連友元和成員中的複製也禁止,就可以宣告乙個private複製建構函式,但不對其進行定義:

(注:最好顯示定義複製建構函式和預設建構函式)

合成賦值操作符:

合成賦值操作符與合成複製建構函式的操作類似:也是逐個成員賦值,有操作物件的每個成員賦值給做運算元物件的對應成員,對於陣列,給每個陣列元素賦值。

複製和賦值常一起使用。

析構函式:

建構函式可以完成所需的資源**,作為類建構函式的補充。

撤銷類物件時會自動呼叫析構函。東帶分配的物件只有在指向該物件的指標被刪除時才撤銷。

如果沒有刪除指向動態物件的指標,則不會執行該物件的析構函式,物件就一直存在,從而導致記憶體洩漏,而且物件內部使用的任何資源也不會釋放。

當物件的引用或指標超出作用域時,不會執行析構函式。只有刪除指向動態分配物件的指標或實際物件(而不是物件的引用)時,才會執行析構函式。

析構函式通常用於釋放在建構函式或在物件生命週期內獲取的資源。

合成析構函式:

編譯器總會為我們合成乙個析構函式,合成析構函式按物件建立時的逆序撤銷每個非static成員。合成析構函式並不刪除指標成員所指向的物件。

編寫自己的析構函式:

在類名字之前加上乙個代字型大小(~),它沒有返回值,沒有形參,不能指定任何形參,所以不能過載析構函式。(乙個類只能提供乙個析構函式)

(注:即使我們編寫了自己的析構函式,合成的析構函式仍然執行。)

管理指標:

懸垂指標:指向乙個不復存在的物件的指標。

定義只能指標類:

1.引用使用計數,智慧型指標將乙個計數器與類指向的物件相關聯。

2.定義值型類:給指標成員提供值語義:複製值型物件時,會得到乙個不同的新副本,對副本的修改不會影響到原有物件上。

分配記憶體或其他資源的了幾乎總是需要定義複製控制成員來管理所分配的資源。

//目前還不能真正的理解複製控制符。。。。

*/

class foo;

int main()

打卡第十七天

第二次了,又沒過.有時候會有一種失敗感,這幾年好像什麼都沒做好,過的好像也不是很開心。昨天兵查過成績後心情就低落起來了,尤其是聽到晨晨得知她沒過時發出的驚訝聲音 你竟然沒過?時,心情立馬跌到了谷底,回到宿舍就再也繃不住了,大哭了一場,媽媽打 詢問情況,看到女兒哭的傷心,竟也無措起來,不知如何安慰。於...

失業第十七天

失業過了十七天,今天進行了第三場面試,說來也巧有好幾個同學在面試的公司,哈哈哈 找個角落了解下內幕 每個公司都有各自的風格,每個面試官也有各自的特點,才面了三家公司就感受到了完全不同的形式,只有hr面試的內容基本相似,簡單說說吧 第一家 技術面試筆試 上機面試內容就聊聊題目,接著聊聊學校生活,在聊的...

寒假第十七天

python連線資料庫 今天學習了一下python如何連線資料庫以及增刪改查 首先我用的是pymysql,是python連線mysql的乙個庫 首先先得安裝pymysql 命令pip install pymysql 具體 import pymysql 引用pymysql模組 開啟資料庫連線db py...