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...