c++ 復制構造函數_C++學習刷題8--復制構造函數和賦值運算符重載函數

一、前言

本部分為C++語言刷題系列中的第8節,主要講解這幾個知識點:復制構造函數和賦值運算符重載函數。歡迎大家提出意見、指出錯誤或提供更好的題目!

二、知識點講解

知識點1:復制構造函數

1、當依據一個已存對象創建一個新對象時,會自動調用復制構造函數,以便將舊對象的內容復制到新對象中進行初始化。例如,按值傳遞對象或按值返回對象。

2、如果類沒有定義復制構造函數,則編譯器會自動添加一個默認的復制構造函數。該默認復制構造函數將舊對象的內容完整復制給新對象,也稱之為"淺復制"。

3、當類中存在指針型的成員變量時,應該提供一個自定義的復制構造函數,以實現依據內容的"深層復制"。

4、復制構造函數的形式:X(const X& x);

知識點2:賦值運算符重載函數

1、當將一個已存對象賦值給另一個已存對象時,會自動調用賦值運算符重載函數,以便將右值對象的內容復制到左值對象中。

2、如果類沒有定義賦值運算符重載函數,則編譯器會自動添加一個默認的賦值運算符重載函數。因此,賦值運算符重載函數只能以成員函數的方式實現,不能以友元函數的方式實現。同時,該默認賦值運算符重載函數將右值對象的內容完整復制給左值對象,也稱之為"淺復制"。

3、當類中存在指針型的成員變量時,應該提供一個自定義的賦值運算符重載函數,以實現依據內容的"深層復制"。

4、賦值運算符重載函數的形式:X& operator=(const X& x);

三、試題解析

1.有如下類定義:

class Bag

{

public:

Bag(int p=200,char s='M') { price=p; size=s; cout<

private:

int price;

char size;

};

若執行語句

Bag Alice, Kelly(Alice), *Twins[2], F4[4];

則輸出結果為( )。

A.MMMMMMMM

B.MMMMMM

C.MMMMM

D.MMMM

正確答案:C

解析:1、Bag Alice語句創建一個新對象,調用構造函數Bag(int p=200, char s='M'),輸出M。2、Bag Kelly(Alice)語句由已存對象創建新對象,調用編譯器生成的復制構造函數,沒有輸出內容。3、Bag *Twins[2]語句定義一個具有2個元素的指針數組,不涉及到對象的創建,不調用任何構造函數,也無任何輸出。4、Bag F4[4]語句定義了具有4個Bag對象的數組,會調用構造函數Bag(int p=200, char s='M')四次,輸出4個M。所以,輸出結果為MMMMM。

2.有如下程序:

#include

using namespace std;

class TV

{

public:

TV(int s=41):size(s) { }

TV(const TV &r):size(r.size) { }

~TV() { }

private:

int size;

};

TV fun(TV &u) { TV t=u; return t; }

void main() { TV x, y; x=fun(y); }

則 TV 類的復制構造函數被調用的次數是( )。

A.1次

B.2次

C.3次

D.4次

答案:B

解析:當依據一個已存對象創建一個新對象時,會調用復制構造函數。語句TV t=u;是由已存對象u創建新對象t,會調用一次復制構造函數。Return t;按值返回,也符合由已存對象創建一個新對象,會調用一次復制構造函數。因此,共調用2次復制構造函數,B選項正確。

3.為類MyClass重載賦值運算符時,應將其重載為類的( )。

A.靜態函數

B.成員函數

C.友元函數

D.虛函數

正確答案:B

解析:如果類中沒有定義賦值運算符重載函數,則編譯器會自動提供一個默認的賦值運算符重載函數。因此,賦值運算符重載函數必須是類的成員函數,正確答案為B。

四、試題測試

1.下列情況中,不會調用復制構造函數的是( )。

A.用一個對象去初始化同一類的另一個新對象時

B.將類的一個對象賦值給該類的另一個對象時

C.函數的形參是類的對象,調用函數進行形參和實參結合時

D.函數的返回值是類的對象,函數執行返回調用時

2.有如下程序:

#include

using namespace std;

class Test

{

public:

Test(int i=0) { cout<

Test(const Test &x) { cout<

Test& operator =(const Test &x)

{

cout<

return *this;

}

~ Test() { cout<

};

void main()

{

Test obj1(1), obj2(obj1), obj3=obj1;

}

運行時的輸出結果是( )。

A.AABDDD

B.AACADDDD

C.ABBDDD

D.ABCADDDD

3.下列關于賦值運算符=重載的敘述中,正確的是( )。

A.賦值運算符只能作為類的成員函數重載

B.默認的賦值運算符實現了"深層復制"功能

C.重載的賦值運算符函數有兩個本類對象作為形參

D.如果已經定義了復制構造函數,就不能重載賦值運算符

4.有如下類定義:

class MyClass

{

public:

MyClass(const char *c=NULL);

~MyClass();

______________ //運算符=的聲明

private:

char *p;

};

若要使語句序列

MyClass s1("test"), s2;

s2=s1;

能夠正常運行,橫線處的語句應為( )。

A. friend MyClass& operator=(const MyClass&);

B. MyClass& operator=(const MyClass&);

C. MyClass& operator=(MyClass,const MyClass&);

D. friend MyClass& operator=(MyClass,const MyClass&);

------------------------------

歡迎大家提出意見、指出錯誤或提供更好的題目,只有大家的共同努力,才能幫助更多人掌握C++的基本概念,順利通過考試!

014f9df9007dbb19cecd57d076bb9e3a.png

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

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

相關文章

ORACLE使用WITH AS和HINT MATERIALIZE優化SQL解決FILTER效率低下

原文&#xff1a;http://blog.csdn.net/liangweiwei130/article/details/37882503 ------------------------------------------------- 在做項目的過程中&#xff0c;一個頁面使用類似如下的SQL查詢數據&#xff0c;為了保密和使用方便&#xff0c;我把項目中有關的表名和字段…

面試題333

2019獨角獸企業重金招聘Python工程師標準>>> 面試題333 博客分類&#xff1a; java 1、spring的緩存,mybatis緩存2、介紹下dubbo。A服務調用B服務&#xff0c;B服務又調用C服務,這種情況怎么辦3、JVM監控工具有哪些&#xff0c;區別又是什么&#xff08;如能追上各個…

mysql vfp_用 VFP 連接 MYSQL 數據庫

今天試了一下用 Visual FoxPro 連接 MySQL 數據庫。首先在自己機子上架設 MySQL 數據庫&#xff0c;就不多說了&#xff0c;我是直接用 XAMPP 架設的服務器。然后在 VFP 里輸入命令&#xff1a;sqlhandle SQLSTRINGCONNECT("driver{MySQL ODBC 5.1 Driver};server127.0.0…

oracle中with的用法及用處

原文出處&#xff1a;http://blog.csdn.net/chenjinlin1/article/details/6572401 ---------------------------------------------------------------- WITH 用于一個語句中某些中間結果放在臨時表空間的SQL語句 如 WITH channel_summary AS ( SELECT channels.channel_de…

xpath選擇當前結點的子節點

2019獨角獸企業重金招聘Python工程師標準>>> xpath選擇當前結點的子節點 博客分類&#xff1a; 搜索引擎&#xff0c;爬蟲 在通過selenium使用xpath選擇節點的時候&#xff0c;可能會遇到這么一種情況&#xff1a;在指定的當前節點下搜索滿足要求的節點。 node dri…

mysql中主從復制配置文件_MySQL主從復制 配置文件實例

1、主服務器配置文件# For advice on how to change settings please see# http://dev.mysql.com/doc/refman/5.6/en/server-configuration-defaults.html[mysqld]# Remove leading # and set to the amount of RAM for the most important data# cache in MySQL. Start at 70%…

SQL中,where 與 having 的性能比較

原文&#xff1a;http://blog.csdn.net/showshore/article/details/7263115 --------------------------------------------------------- 在做項目的過程中&#xff0c;使用sql語句時&#xff0c;很多時候會用到where或having。 看到國外一個論壇上有人提到兩者性能比較的這個…

Spark 獨立部署模式

2019獨角獸企業重金招聘Python工程師標準>>> Spark 獨立部署模式 博客分類&#xff1a; spark 除了在 Mesos 或 YARN 集群上運行之外, Spark 還提供一個簡單的獨立部署的模塊。你通過手動開始master和workers 來啟動一個獨立的集群。你也可以利用我們提供的腳本 .…

mysql數據庫的鏈接地址_常用數據庫連接URL地址大全

1、Oracle8/8i/9i數據庫(thin模式) Class.forName("oracle.jdbc.driver.OracleDriver").newInstance(); String url="jdbc:oracle:thin:@localhost:1521:orcl"; //orcl為數據庫的SID String user="test"; String password="test"; Con…

數據庫中where與having區別~~~

1、where和having的執行級別不同 在查詢過程中聚合語句(sum,min,max,avg,count)要比having子句優先執行.而where子句在查詢過程中執行優先級別優先于聚合語句(sum,min,max,avg,count)。 having就是來彌補where在分組數據判斷時的不足。因為where執行優先級別要快于聚合語句。…

spring boot 1.5.4 定時任務和異步調用(十)

1 Spring Boot定時任務和異步調用 我們在編寫Spring Boot應用中經常會遇到這樣的場景&#xff0c;比如&#xff1a;我需要定時地發送一些短信、郵件之類的操作&#xff0c;也可能會定時地檢查和監控一些標志、參數等。 spring boot定時任務spring-boot-jsp項目源碼&#…

ORA-04063: view DAILY.TMP_TBX_100_0_S4 有錯誤

執行&#xff1a; CREATE TABLE TMP_TBX_100_0_S3 AS SELECT t.* FROM (select t1.*,NULL AS sdate, NULL AS report_id from TMP_TBX_100_0_S4_1 t1 union all select t2.* from TMP_TBX_100_0_S4_2 t2) t 報錯&#xff1a; ORA-00955: name is already used by an exis…

MySQL左連接還有過濾條件_MySQL左連接問題,右表做篩選,左表列依然在?

問 題原料兩張表&#xff0c;一張user表&#xff0c;一張user_log表(這個例子舉的不好)CREATE TABLE user (id int(11) NOT NULL AUTO_INCREMENT,name varchar(20) DEFAULT NULL,PRIMARY KEY (id)) ENGINEInnoDB DEFAULT CHARSETutf8;CREATE TABLE user_log (id int(10) NOT NU…

2017工作總結

靜兒總結自己的職業生涯分為三個階段。第一個階段為期十年&#xff0c;是純技術階段&#xff0c;是人生的積累期。第二個階段是管理階段&#xff0c;是綜合能力整合期。第三個階段是突破階段&#xff0c;打造自己獨特的核心競爭力。 第一階段 剛畢業的同學可能會覺得技術高大上…

批量刪除table或view

一個個刪太費時了。一個簡單可行的方法。 思路&#xff1a; 找出要刪除的表名/視圖名&#xff0c;然后拼接刪除sql&#xff0c;執行。 批量刪除表&#xff1a; 1、找出要刪除的表名select table_name from user_tables where table_name like S1MSGLATENCY_2016032%;2、復制這…

編譯安裝mysql5.5.39_編譯安裝MySQL5.5

防偽碼&#xff1a;沒有相當程度的孤獨是不可能有內心的平和。1、測試環境主機名IP系統MySQL版本MySQL-00192.168.10.23CentOS release 6.9 (Final)5.5.562、部署2.1 卸載之前版本rpm -qa|grep mysqlrpm -e --nodeps mysql-libs-5.1.73-8.el6_8.x86_642.2 安裝依賴包和cmakeyum…

你真的了解iOS怎么取屬性的嗎?

你真的了解iOS怎么取屬性的嗎&#xff1f; 本文來自CocoaChina粉絲FlyOceanFish投稿如果iOS中談到取屬性&#xff0c;相信大家都會夸夸其談&#xff0c;不就是get方法嗎&#xff1f;或者大談kvc取屬性的機制。不得不說這些也是對的。這時大家可能就疑惑了&#xff0c;那你還要說…

Oracle表的并行度

查看dba_tables數據字典時&#xff0c;可以發現有“DEGREE”字段&#xff0c;這個字段表示的就是數據表的并行度。這個參數的設置&#xff0c;關系著數據庫的I/O&#xff0c;以及sql的執行效率。并行度的優點就是能夠最大限度的利用機器的多個cpu資源&#xff0c;是多個cpu同時…

mysql 臨時表 限制_Mysql臨時表

當你創建臨時表的時候&#xff0c;你可以使用temporary關鍵字。如&#xff1a;create temporary table tmp_table(name varchar(10) not null,passwd char(6) not null)‘或CREATE TEMPORARY TABLE IF NOT EXISTS sp_output_tmp ENGINE MEMORY SELECT …from … where IDcurre…

10年老兵給程序員的10條建議!

2019獨角獸企業重金招聘Python工程師標準>>> 程序員雖然薪資待遇好&#xff0c;但是也得付出努力&#xff0c;技術好才行。特別是對于剛剛進入編程工作的新手程序員和正在學習編程的同學來說&#xff0c;一寫代碼就報錯&#xff0c;出bug。作為一個工作了10年的老兵…