拷貝構造函數和賦值函數

1、拷貝構造函數:用一個已經有的對象構造一個新的對象。

CA(const CA & c )函數的名稱必須和類名稱相一致,它的唯一的一個參數是本類型的一個引用變量,該參數是const 類型,不可變。

?? 拷貝構造函數什么時候被用到?

(1)當用一個已初始化過的自定義類型對象去初始化另一個新構造的對象的時候。

(2)一個對象以值傳遞的方式傳入。在調用函數時需要將實參對象完整的傳遞給形參,系統是通過調用拷貝構造函數來實現的,這樣能保證形具有和實參完全相同的值。

(3)一個對象以值傳遞的方式傳出函數體。在函數調用完畢將返回值帶回函數調用處。此時需要將函數中的對象拷貝到一個臨時對象處并傳給該函數的調用處。

?拷貝構造函數為什么傳引用而不傳值?

如果拷貝構造函數進行值傳遞的話,那么形參會產生一個新對象,也就是會調用拷貝構造函數,因此會形成一個死循環。

調用拷貝構造函數需要先創建形參對象,創建形參對象又需要調用拷貝構造函數,無限遞歸肯定是不正確的,所以在這里要用引用而不是值傳遞。

?

2、賦值運算符的重載函數:用一個已經有的對象給一個同一類型的對象賦值。(兩個對象都存在)

CA & operator = (const? CA & )

返回值的對象為引用是為了可以連續賦值

賦值函數中可以既可以使用引用也可以使用值傳遞,不過值傳遞會多生成一個對象,造成資源的浪費。

class A
{
private:
?int a;
?int b;
public:
?A (const A & arg) // 拷貝構造函數 ?
?{
??a = arg.a;
??b = arg.b;
?}
?A & operator = ( const A & arg) //重載的賦值函數?
?{
??if(this != &arg)// 先判斷下是否是自身賦值
??{
???a = arg.a;
???b = arg.b;
??}
??return *this;
?}
};

當類中含有指針成員時,兩者的意義有很大區別

復制構造函數需為指針變量分配內存空間,并將實參的值拷貝到其中;而賦值操作符它實現的功能僅僅是將‘=’號右邊的值拷貝至左值,在左邊對象內存不足時,

先釋放然后再申請。當然賦值操作符必須檢測是否是自身賦值,若是則直接返回當前對象的引用而不進行賦值操作。

拷貝構造函數分為兩類:

一類是系統默認提供的拷貝構造函數,只是簡單的把棧里面的數據進行拷貝,堆上面的內容沒有進行拷貝。
二類是自己定義的拷貝構造函數,能夠對堆上面的東西進行深度的拷貝。
這里又要提到深拷貝和淺拷貝的問題。
淺拷貝

深拷貝

class Student
{
private:
?char *name;
public:
?Student (const Student & arg)
?{
??int length = strlen(arg.name)+1;
??this->name = new char[length]; ? // 深拷貝,先在堆上分配內存,再拷貝內容。
??strncpy(this->name,arg.name,length);
?}
?Student & operator=( const Student &arg)
?{
??if(this != &arg)
??{
???delete []name;// 先銷毀之前分配的堆上的內存
??}
??int length = strlen(arg.name)+1;
??this->name = new char[length];// 重新分配,并拷貝。
??strncpy(this->name,arg.name,length);
??return *this;
?}
};

?

轉載于:https://www.cnblogs.com/97-5-1/p/8673326.html

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

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

相關文章

[bzoj3036]綠豆蛙的歸宿

題目大意:給定 $DAG$ 帶邊權連通圖,保證所有點都能到達終點 $n$,每個點等概率沿邊走,求起點 $1$ 到終點 $n$ 的期望長度。 題解:拓撲,然后倒著$DP$就可以了 卡點:無 C Code: #includ…

5902. 檢查句子中的數字是否遞增

5902. 檢查句子中的數字是否遞增 句子是由若干 token 組成的一個列表,token 間用 單個 空格分隔,句子沒有前導或尾隨空格。每個 token 要么是一個由數字 0-9 組成的不含前導零的 正整數 ,要么是一個由小寫英文字母組成的 單詞 。 示例&…

蒜頭君吃桃

蒜頭君買了一堆桃子不知道個數,第一天吃了一半的桃子,還不過癮,有多吃了一個。以后他每天吃剩下的桃子的一半還多一個,到 nn 天只剩下一個桃子了。蒜頭君想知道一開始買了多少桃子。 輸入格式 輸入一個整數 n(2≤n≤60)&#xff0…

Chrome keyboard shortcuts

2019獨角獸企業重金招聘Python工程師標準>>> Chrome keyboard shortcuts https://support.google.com/chrome/answer/157179?hlen 轉載于:https://my.oschina.net/qwfys200/blog/1927456

數據中心細節_當細節很重要時數據不平衡

數據中心細節定義不平衡數據 (Definition Imbalanced Data) When we speak of imbalanced data, what we mean is that at least one class is underrepresented. For example, when considering the problem of building a classifier, let’s call it the Idealisstic-Voter.…

辛普森悖論_所謂的辛普森悖論

辛普森悖論We all know the Simpsons family from Disneyland, but have you heard about the Simpson’s Paradox from statistic theory? This article will illustrate the definition of Simpson’s Paradox with an example, and show you how can it harm your statisti…

查看NVIDIA使用率工具目錄

2019獨角獸企業重金招聘Python工程師標準>>> C:\Program Files\NVIDIA Corporation\Display.NvContainer\NVDisplay.Container.exe 轉載于:https://my.oschina.net/u/2430809/blog/1927560

2043. 簡易銀行系統

2043. 簡易銀行系統 你的任務是為一個很受歡迎的銀行設計一款程序,以自動化執行所有傳入的交易(轉賬,存款和取款)。銀行共有 n 個賬戶,編號從 1 到 n 。每個賬號的初始余額存儲在一個下標從 0 開始的整數數組 balance…

余弦相似度和歐氏距離_歐氏距離和余弦相似度

余弦相似度和歐氏距離Photo by Markus Winkler on UnsplashMarkus Winkler在Unsplash上拍攝的照片 This is a quick and straight to the point introduction to Euclidean distance and cosine similarity with a focus on NLP.這是對歐氏距離和余弦相似度的快速而直接的介紹&…

bzoj2152 聰聰可可

題目描述 聰聰和可可是兄弟倆,他們倆經常為了一些瑣事打起來,例如家中只剩下最后一根冰棍而兩人都想吃、兩個人都想玩兒電腦(可是他們家只有一臺電腦)……遇到這種問題,一般情況下石頭剪刀布就好了,可是他們…

七、 面向對象(二)

匿名類對象 創建的類的對象是匿名的。當我們只需要一次調用類的對象時,我們就可以考慮使用匿名的方式創建類的對象。特點是創建的匿名類的對象只能夠調用一次! package day007;//圓的面積 class circle {double radius;public double getArea() {// TODO…

機器學習 客戶流失_通過機器學習預測流失

機器學習 客戶流失介紹 (Introduction) This article is part of a project for Udacity “Become a Data Scientist Nano Degree”. The Jupyter Notebook with the code for this project can be downloaded from GitHub.本文是Udacity“成為數據科學家納米學位”項目的一部分…

2044. 統計按位或能得到最大值的子集數目

2044. 統計按位或能得到最大值的子集數目 給你一個整數數組 nums ,請你找出 nums 子集 按位或 可能得到的 最大值 ,并返回按位或能得到最大值的 不同非空子集的數目 。 如果數組 a 可以由數組 b 刪除一些元素(或不刪除)得到&…

redis系列:分布式鎖

1 介紹 這篇博文講介紹如何一步步構建一個基于Redis的分布式鎖。會從最原始的版本開始,然后根據問題進行調整,最后完成一個較為合理的分布式鎖。 本篇文章會將分布式鎖的實現分為兩部分,一個是單機環境,另一個是集群環境下的Redis…

Qt中的坐標系統

轉載:原野追逐 Qt使用統一的坐標系統來定位窗口部件的位置和大小。 以屏幕的左上角為原點即(0, 0)點,從左向右為x軸正向,從上向下為y軸正向,這整個屏幕的坐標系統就用來定位頂層窗口; 此外,窗口內部也有自己…

預測股票價格 模型_建立有馬模型來預測股票價格

預測股票價格 模型前言 (Preface) If you are reading this, it’s most likely because you love to solve puzzles. I’m a very competitive person by nature. The Mt. Everest of puzzles, in my opinion, is trying to find excess returns through active trading in th…

Python 模塊 timedatetime

time & datetime 模塊 在平常的代碼中,我們常常需要與時間打交道。在Python中,與時間處理有關的模塊就包括:time,datetime,calendar(很少用,不講),下面分別來介紹。 在開始之前,首先要說明幾…

大數模板Java

import java.util.*; import java.math.BigInteger; public class Main{public static void main(String args[]){Scanner cinnew Scanner(System.in);BigInteger a,b;acin.nextBigInteger();bcin.nextBigInteger();System.out.println(a.add(b));//加法System.out.println(a.…

檸檬工會_工會經營者

檸檬工會Hey guys! This week we’ll be going over some ways to work with result sets in MySQL. These result sets are the outputs of your everyday queries, such as:大家好! 本周,我們將介紹一些在MySQL中處理結果集的方法。 這些結果集是您日常…

229. 求眾數 II

229. 求眾數 II 給定一個大小為 n 的整數數組,找出其中所有出現超過 ? n/3 ? 次的元素。 示例 1:輸入:[3,2,3] 輸出:[3]示例 2:輸入:nums [1] 輸出:[1]示例 3:輸入:…