C primer 習題筆記第13 15章

2021-06-27 17:43:00 字數 4698 閱讀 5433

1、下面第二個初始化不能編譯。可以從 vector 的定義得出什麼推斷?

vectorv1(42);

vectorv2 = 42;

【解答】

若能編譯成功說明,這是個複製初始化,建立 v2 時,首先呼叫接受乙個 int 型形參的 vector 建構函式,建立乙個臨時 vector 物件,然後再呼叫複製建構函式用這個臨時物件來初始化 v2。現在不能編譯,說明vector 沒有定義複製建構函式。

2、假定 point 為類型別,該類型別有乙個複製建構函式,指出下面程式段中每乙個使用了複製建構函式的地方:

point global;

point foo_bar( point arg ) //  呼叫此函式時,將實參物件的副本傳遞給形參 point 的物件 arg

;   //  使用陣列初始化列表來初始化陣列的每個元素。

retur n  *heap;    //  從函式返回 point 物件*heap 的副本

}3、哪個類定義可能需要乙個複製建構函式?

(a)  包含四個 float 成員的 point3w 類。

(b) matrix 類,其中,實際矩陣在建構函式中動態分配,在析構函式中刪除。

(c)  payroll 類,在這個類中為每個物件提供唯一 id 。

(d)  word 類,包含乙個 string 和乙個以行列位置對為元素的 vector。 

【解答】

(b)需要,涉及到指標及動態分配

(c)需要,在根據已存在的 payroll 物件建立其副本時,需要提供唯一的 id.

其他的均可以呼叫編譯器的提供的複製建構函式,或者呼叫類型別的 string 和 vector 的複製建構函式。

4、複製建構函式的形參並不限制為 const,但必須是乙個引用,解釋這個限制的基本原理,例如,解釋為什麼下面的定義不能工作,

sales_item::sales_item(  const sales_item rhs );

【解答】

它不能工作的原因是:當形參為非引用型別時,將複製實參的值,給這個 copy constructor,但是,每當以傳值方式傳遞引數時,會導致呼叫複製建構函式,因此,如果要使用以傳值方式傳遞引數的 copy constructor,必須使用乙個「不以傳值方式傳遞引數」的 copy  constructor, 否 則 就 會 導 致 copy constructor 的無窮遞迴呼叫。這個「不以傳值方式傳遞引數」的方法就是使用  形參是乙個引用  的copy constructor,即以傳位址的方式傳遞引數。

5、類何時需要定義複製操作符?

【解答】

在需要定義複製建構函式時,也需要定義賦值操作符,即如果乙個類(1)類中包含指標型資料成員,(2)或者在進行賦值操作時需要做一些特定工作,則該類需要定義賦值操作符。

6、定義乙個 employee 類,包含雇員名字和乙個唯一的雇員標識,為該類定義預設建構函式和引數為表示雇員名字的 string 建構函式。如果該類需要複製建構函式或賦值操作符,實現這些函式。

【解答】

class employee

//  預設建構函式

employee(  const  std::string  &na  ):  name(  na  ), id(cnt) 

//  建構函式

//  拷貝建構函式

employee(  const  employee  &  rhs  )  : name( rhs.name ) , id(cnt)  

//  賦值操作符

employee & operator= ( const employee & rhs ) 

private:

string name;

int id;

static int cnt;

};另外需要在類外對 static 成員進行初始化:

int employee::cnt =1 ;

7、「cobble‖ 」 == 「store‖」  應用了 c++語言內建版本的過載==

8、使用標準庫函式物件和函式介面卡,定義乙個物件用於:

(a)  查詢大於 1024 的所有值。

(b)  查詢不等於 pooh 的所有字串。

(c)  將所有值乘以 2

【解答】

(a)  find_if(  vec.begin(),  vec.end(), bind2nd(  greater(), 1024 ) );

(b)  find_i f  (  svec.begin(),  svec.end(), bind2nd(  not_equal_to(),  ―pooh‖);

(c)  transform(  ivec.begin(),  ivec.end(),  ivec.begin(), bind2nd(  multiplies(),  2 ) );

9、使用標準庫函式物件代替 gt_cls 來查詢指定長度的單詞。

【解答】

輸入乙個指定長度:

vectortext;

// …   // input words into text

string::size_type len;

cin >> len;

string *w;

for  (  vector::iterator  it  =  text.begin();  it  != text.end(); ++it )

cout  <<  "the  words  whose  length  is  "<<  len  <<  "was found.,it is:"<< *w <

10、解釋這兩個轉換操作符之間的不同:

class integral

;【解答】

不同:前者將物件轉換為 const  int 值,後者將物件轉換為 int 值,前者太嚴格,限制使用在可以使用const int  值的地方,只保留後者,將變得更為通用。

11、哪個 calc() 函式是如下函式呼叫的最佳可行函式?列出呼叫每個函式所需的轉換序列,並解釋為什麼所選定的就是最佳可行函式。

class longdouble

;void calc( int );

void calc( longdouble );

double dval;

calc( dval ); // which function?

【解答】

最佳可行函式是 void  calc(int),   呼叫此函式的轉換為:將實參 double 型別轉換為 int 型別的,為標準轉換;呼叫 void  calc(  longdouble)函式時,將實參從 double 轉換為 longdouble 型別,為類型別轉換,因為標準轉換優於類型別轉換,所以第乙個函式為最佳可行函式。

12、對於下面的類,列出 c1 中的成員函式訪問concretebase 的 static 成員的所有方式,列出 c2 型別的物件訪問這些成員的所有方式。

struct concretebase

; struct c1 : public concretebase

struct c2 : public concretebase

【解答】

c1 中的成員函式訪問基類的 static 成員可以用

( 1) concretebase::成員名

(2) c1::成員名

(3)  通過 c1 類物件或物件的引用,使用(  .  )操作符訪問

(4)  通過 c1 類物件的指標,使用箭頭(->)操作符訪問

(5)  直接使用成員名。

c2 型別的物件訪問時, 只可以訪問基類的成員函式,假如 c2 物件為 obj_c2,  可用

(1) obj_c2.object_count ()

(2) concretebase::object_count()

(3) c2::pbject_count()

13、說明在什麼情況下類應該具有虛析構函式。

【解答】

作為基類使用的類應該具有虛析構函式,以保證在刪除指向動態分配物件的基類指標時,根據指標實際指向的物件所屬的型別執行適當的析構函式。

14、虛析構函式必須執行什麼操作?

【解答】

虛析構函式可以為空,即不執行任何操作,而當類中有指標類成員時,則需要自己定義虛析構函式,以對指標成員進行適當的清除。

15、通過指向基類物件的指標訪問其protected的成員是錯誤的,應該將指標定義為指向子類的物件的指標。

16、假定 derived 繼承 base,並且 base 將下面的函式定義為虛函式,假定 derived 打算定義自己的這個虛函式的版本,確定在 derived 中哪個宣告是錯誤的,並指出為什麼錯。

(a) base* base::copy( base* );

base* derived::copy( derived* );

(b) base* base::copy( base* 0;

derived* derived::copy( base* );

(c)  ostream& base::print( int, ostream& = cout );

ostream& derived::print( int, ostream& );

(d) void base::eval() const;

void derived::eval();

【解答】

(a)  錯了,因為 derived 中宣告的 copy 是乙個非虛函式,而不是對 base 中的虛函式 copy 的過載,因為派生類的重定義的虛函式必須與基類中的虛函式具有相同原型。而且此時 derived 中定義的 copy 函式還遮蔽了基類base 的 copy 函式。

C primer習題筆記第4章

1 解釋下列宣告語句,幵指出哪些是非法的,為什麼?d int ip,ip2 e const int i 0,p i 解答 d 合法。定義了 int 物件 ip2 和指向 int 型物件的指標 ip。e 合法。定義了 const int 型物件 i 和指向 const int 型物件的指標 p,i 初...

C primer習題筆記第7 9章

1 下面的程式雖然是合法的,但可用性還不夠好,指出並改正該程式的侷限。bool test string s 解答 其侷限在於 此處使用引用形參的唯一目的是避免複製實參,但沒有將形參定義為const引用,從而導致不能使用字串字面值呼叫該函式 因為非const引用形參只能與完全同型別的非const物件關...

C primer習題筆記

1 解釋下面每個函式模板的定義並指出是否有非法的,改正所發現的錯誤。e typedef char ctype templatectype f5 ctype a 解答 e 合法,定義了乙個模板函式f5,該函式的返回型別與形參型別相同,均可繫結到任何型別 而不一定是char型別 2 何時必須使用type...