一、前言
本部分為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++的基本概念,順利通過考試!
