第十五章 15 9 3節練習

2021-06-25 20:45:43 字數 1627 閱讀 4247

練習15.34

針對圖15.3(第565頁)構建的表示式:

(a) 列舉出在處理表示式過程中所有建構函式。

(b) 列舉出cout << q所呼叫的rep。

(c) 列舉出q.eval()所呼叫的eval。

解答:(a) query q = query("fiery") & query("bird") | query("wind");

可以將這個表示式進行化簡:

query fiery = query("fiery");

query bird = query("bird");

query wind = query("wind");

這裡就用到了query的建構函式。①

再就按照運算順序,從左往右:

andquery and = firey & bird;

這裡就要用到andquery的建構函式。②

不過,andquery類是從binaryquery類繼承而來,

所以在呼叫到andquery的建構函式之前,

需要呼叫binaryquery類的建構函式。③

binaryquery類是從query_base繼承而來,

我們在query_base中沒有看到建構函式,但是編譯器會合成乙個建構函式。

所以,這裡又呼叫了query_base的建構函式。④

當全部構造完畢。

andquery and = firey & bird;

就計算完成了。

最後,orquery or = and | wind;

這裡首先呼叫了orquery的建構函式。⑤

剩下的過程與andquery呼叫建構函式的情況相同。

(b) 

((fiery & bird) | wind)

(c) 

因為在orquery中,eval有過載,所以eval()也是呼叫的orquery的。

練習15.35

實現query類和query_base類,其中需要定義rep而無須定義eval。

解答:類的實現參照書中的實現。

只定義rep是要為了列印而用的。

練習15.36

在建構函式和rep成員中新增列印語句新增答應語句,執行你的**以檢驗你對本節第一題中(a)(b)兩小題回答是否正確:

解答:練習15.37

如果在派生類中含有shared_ptr型別的成員而非query型別的成員,則你的類需要作出怎麼樣的改變?

解答:如果使用書中原始碼,需要改的東西還真的挺多的。

為了表明這題的意義,這裡引用別的blog中的文章,對基類指標進行分析。

在類似c的強行轉換會比shared_ptr要明了很多,當然這裡還需要注意shared_ptr的使用。

練習15.38

下面的宣告合法嗎?如果不合法請解釋原因;如果合法,請指出該宣告的含義。

binaryquery a = query("fiery") & query("bird");

andquery b = query("fiery") & query("bird");

orquery c = query("fiery") & query("bird");

解答:都不合法,都缺少轉換函式,無法完成query向orquery, andquery, binaryquery的隱式轉換。

第十五章 15 2 1節練習

終於到15章了,物件導向程式設計 之前一直對這種設計方式沒有什麼概念,這裡把概念在這裡再提一下吧。物件導向程式設計 object oriented programming 的核心思想是資料抽象 繼承和動態繫結。通過使用資料抽象,我們可以將類的介面與實現分離 見第七章 使用繼承,可以定義相似的型別並對...

第十五章 15 2 3節練習

練習15.8 給出靜態型別和動態型別的定義。解答 這裡的靜態型別和動態型別是指在繼承關係中的兩種表示式或變數。引用 表示式的靜態型別在編譯時總是已知的,它是變數宣告時的型別或表示式生成的型別 引用 動態型別則是變數或表示式表示的記憶體中的物件的型別。動態型別知道執行時才可知。練習15.9 在什麼情況...

第十五章 15 3節練習

練習15.11 為你的quote類體系新增乙個名為debug的虛函式,令其分別顯示是每個類的資料成員。解答 void quote debug void bulk quote debug 練習15.12 有必要將乙個成員函式同事宣告成override和final嗎?為什麼?解答 相應情況下應該是有必要...