c++类指针赋值表达式必须是可修改的左值_C++学习刷题8--复制构造函数和赋值运算符重载函数...
一、前言
本部分為C++語言刷題系列中的第8節(jié),主要講解這幾個(gè)知識(shí)點(diǎn):復(fù)制構(gòu)造函數(shù)和賦值運(yùn)算符重載函數(shù)。歡迎大家提出意見、指出錯(cuò)誤或提供更好的題目!
二、知識(shí)點(diǎn)講解
知識(shí)點(diǎn)1:復(fù)制構(gòu)造函數(shù)
1、當(dāng)依據(jù)一個(gè)已存對(duì)象創(chuàng)建一個(gè)新對(duì)象時(shí),會(huì)自動(dòng)調(diào)用復(fù)制構(gòu)造函數(shù),以便將舊對(duì)象的內(nèi)容復(fù)制到新對(duì)象中進(jìn)行初始化。例如,按值傳遞對(duì)象或按值返回對(duì)象。
2、如果類沒有定義復(fù)制構(gòu)造函數(shù),則編譯器會(huì)自動(dòng)添加一個(gè)默認(rèn)的復(fù)制構(gòu)造函數(shù)。該默認(rèn)復(fù)制構(gòu)造函數(shù)將舊對(duì)象的內(nèi)容完整復(fù)制給新對(duì)象,也稱之為"淺復(fù)制"。
3、當(dāng)類中存在指針型的成員變量時(shí),應(yīng)該提供一個(gè)自定義的復(fù)制構(gòu)造函數(shù),以實(shí)現(xiàn)依據(jù)內(nèi)容的"深層復(fù)制"。
4、復(fù)制構(gòu)造函數(shù)的形式:X(const X& x);
知識(shí)點(diǎn)2:賦值運(yùn)算符重載函數(shù)
1、當(dāng)將一個(gè)已存對(duì)象賦值給另一個(gè)已存對(duì)象時(shí),會(huì)自動(dòng)調(diào)用賦值運(yùn)算符重載函數(shù),以便將右值對(duì)象的內(nèi)容復(fù)制到左值對(duì)象中。
2、如果類沒有定義賦值運(yùn)算符重載函數(shù),則編譯器會(huì)自動(dòng)添加一個(gè)默認(rèn)的賦值運(yùn)算符重載函數(shù)。因此,賦值運(yùn)算符重載函數(shù)只能以成員函數(shù)的方式實(shí)現(xiàn),不能以友元函數(shù)的方式實(shí)現(xiàn)。同時(shí),該默認(rèn)賦值運(yùn)算符重載函數(shù)將右值對(duì)象的內(nèi)容完整復(fù)制給左值對(duì)象,也稱之為"淺復(fù)制"。
3、當(dāng)類中存在指針型的成員變量時(shí),應(yīng)該提供一個(gè)自定義的賦值運(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)建一個(gè)新對(duì)象,調(diào)用構(gòu)造函數(shù)Bag(int p=200, char s='M'),輸出M。2、Bag Kelly(Alice)語句由已存對(duì)象創(chuàng)建新對(duì)象,調(diào)用編譯器生成的復(fù)制構(gòu)造函數(shù),沒有輸出內(nèi)容。3、Bag *Twins[2]語句定義一個(gè)具有2個(gè)元素的指針數(shù)組,不涉及到對(duì)象的創(chuàng)建,不調(diào)用任何構(gòu)造函數(shù),也無任何輸出。4、Bag F4[4]語句定義了具有4個(gè)Bag對(duì)象的數(shù)組,會(huì)調(diào)用構(gòu)造函數(shù)Bag(int p=200, char s='M')四次,輸出4個(gè)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ù)一個(gè)已存對(duì)象創(chuàng)建一個(gè)新對(duì)象時(shí),會(huì)調(diào)用復(fù)制構(gòu)造函數(shù)。語句TV t=u;是由已存對(duì)象u創(chuàng)建新對(duì)象t,會(huì)調(diào)用一次復(fù)制構(gòu)造函數(shù)。Return t;按值返回,也符合由已存對(duì)象創(chuàng)建一個(gè)新對(duì)象,會(huì)調(diào)用一次復(fù)制構(gòu)造函數(shù)。因此,共調(diào)用2次復(fù)制構(gòu)造函數(shù),B選項(xiàng)正確。
3.為類MyClass重載賦值運(yùn)算符時(shí),應(yīng)將其重載為類的( )。
A.靜態(tài)函數(shù)
B.成員函數(shù)
C.友元函數(shù)
D.虛函數(shù)
正確答案:B
解析:如果類中沒有定義賦值運(yùn)算符重載函數(shù),則編譯器會(huì)自動(dòng)提供一個(gè)默認(rèn)的賦值運(yùn)算符重載函數(shù)。因此,賦值運(yùn)算符重載函數(shù)必須是類的成員函數(shù),正確答案為B。
四、試題測試
1.下列情況中,不會(huì)調(diào)用復(fù)制構(gòu)造函數(shù)的是( )。
A.用一個(gè)對(duì)象去初始化同一類的另一個(gè)新對(duì)象時(shí)
B.將類的一個(gè)對(duì)象賦值給該類的另一個(gè)對(duì)象時(shí)
C.函數(shù)的形參是類的對(duì)象,調(diào)用函數(shù)進(jìn)行形參和實(shí)參結(jié)合時(shí)
D.函數(shù)的返回值是類的對(duì)象,函數(shù)執(zhí)行返回調(diào)用時(shí)
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)行時(shí)的輸出結(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ù)有兩個(gè)本類對(duì)象作為形參
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&);
------------------------------
歡迎大家提出意見、指出錯(cuò)誤或提供更好的題目,只有大家的共同努力,才能幫助更多人掌握C++的基本概念,順利通過考試!
總結(jié)
以上是生活随笔為你收集整理的c++类指针赋值表达式必须是可修改的左值_C++学习刷题8--复制构造函数和赋值运算符重载函数...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 12306顶住压力了:春运已售出3.85
- 下一篇: 苹果CEO奔驰高层…外媒酸了:跨国公司高