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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

c++类指针赋值表达式必须是可修改的左值_C++学习刷题8--复制构造函数和赋值运算符重载函数...

發(fā)布時間:2023/12/15 c/c++ 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 c++类指针赋值表达式必须是可修改的左值_C++学习刷题8--复制构造函数和赋值运算符重载函数... 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

一、前言

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

二、知識點(diǎn)講解

知識點(diǎn)1:復(fù)制構(gòu)造函數(shù)

1、當(dāng)依據(jù)一個已存對象創(chuàng)建一個新對象時,會自動調(diào)用復(fù)制構(gòu)造函數(shù),以便將舊對象的內(nèi)容復(fù)制到新對象中進(jìn)行初始化。例如,按值傳遞對象或按值返回對象。

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

3、當(dāng)類中存在指針型的成員變量時,應(yīng)該提供一個自定義的復(fù)制構(gòu)造函數(shù),以實(shí)現(xiàn)依據(jù)內(nèi)容的"深層復(fù)制"。

4、復(fù)制構(gòu)造函數(shù)的形式:X(const X& x);

知識點(diǎn)2:賦值運(yùn)算符重載函數(shù)

1、當(dāng)將一個已存對象賦值給另一個已存對象時,會自動調(diào)用賦值運(yùn)算符重載函數(shù),以便將右值對象的內(nèi)容復(fù)制到左值對象中。

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

3、當(dāng)類中存在指針型的成員變量時,應(yīng)該提供一個自定義的賦值運(yùn)算符重載函數(shù),以實(shí)現(xiàn)依據(jù)內(nèi)容的"深層復(fù)制"。

4、賦值運(yùn)算符重載函數(shù)的形式: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;

};

若執(zhí)行語句

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

則輸出結(jié)果為( )。

A.MMMMMMMM

B.MMMMMM

C.MMMMM

D.MMMM

正確答案:C

解析:1、Bag Alice語句創(chuàng)建一個新對象,調(diào)用構(gòu)造函數(shù)Bag(int p=200, char s='M'),輸出M。2、Bag Kelly(Alice)語句由已存對象創(chuàng)建新對象,調(diào)用編譯器生成的復(fù)制構(gòu)造函數(shù),沒有輸出內(nèi)容。3、Bag *Twins[2]語句定義一個具有2個元素的指針數(shù)組,不涉及到對象的創(chuàng)建,不調(diào)用任何構(gòu)造函數(shù),也無任何輸出。4、Bag F4[4]語句定義了具有4個Bag對象的數(shù)組,會調(diào)用構(gòu)造函數(shù)Bag(int p=200, char s='M')四次,輸出4個M。所以,輸出結(jié)果為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 類的復(fù)制構(gòu)造函數(shù)被調(diào)用的次數(shù)是( )。

A.1次

B.2次

C.3次

D.4次

答案:B

解析:當(dāng)依據(jù)一個已存對象創(chuàng)建一個新對象時,會調(diào)用復(fù)制構(gòu)造函數(shù)。語句TV t=u;是由已存對象u創(chuàng)建新對象t,會調(diào)用一次復(fù)制構(gòu)造函數(shù)。Return t;按值返回,也符合由已存對象創(chuàng)建一個新對象,會調(diào)用一次復(fù)制構(gòu)造函數(shù)。因此,共調(diào)用2次復(fù)制構(gòu)造函數(shù),B選項(xiàng)正確。

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

A.靜態(tài)函數(shù)

B.成員函數(shù)

C.友元函數(shù)

D.虛函數(shù)

正確答案:B

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

四、試題測試

1.下列情況中,不會調(diào)用復(fù)制構(gòu)造函數(shù)的是( )。

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

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

C.函數(shù)的形參是類的對象,調(diào)用函數(shù)進(jìn)行形參和實(shí)參結(jié)合時

D.函數(shù)的返回值是類的對象,函數(shù)執(zhí)行返回調(diào)用時

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;

}

運(yùn)行時的輸出結(jié)果是( )。

A.AABDDD

B.AACADDDD

C.ABBDDD

D.ABCADDDD

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

A.賦值運(yùn)算符只能作為類的成員函數(shù)重載

B.默認(rèn)的賦值運(yùn)算符實(shí)現(xiàn)了"深層復(fù)制"功能

C.重載的賦值運(yùn)算符函數(shù)有兩個本類對象作為形參

D.如果已經(jīng)定義了復(fù)制構(gòu)造函數(shù),就不能重載賦值運(yùn)算符

4.有如下類定義:

class MyClass

{

public:

MyClass(const char *c=NULL);

~MyClass();

______________ //運(yùn)算符=的聲明

private:

char *p;

};

若要使語句序列

MyClass s1("test"), s2;

s2=s1;

能夠正常運(yùn)行,橫線處的語句應(yīng)為( )。

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++的基本概念,順利通過考試!

總結(jié)

以上是生活随笔為你收集整理的c++类指针赋值表达式必须是可修改的左值_C++学习刷题8--复制构造函数和赋值运算符重载函数...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。