日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

c++ 复制构造函数_C++学习刷题8--复制构造函数和赋值运算符重载函数

發布時間:2025/3/11 c/c++ 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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++的基本概念,順利通過考試!

總結

以上是生活随笔為你收集整理的c++ 复制构造函数_C++学习刷题8--复制构造函数和赋值运算符重载函数的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。