知識點:
1. 關於inline, inline是一種用於實現的關鍵字,而不是一種「用於宣告的關鍵字」。 inline關鍵字必須與函式定義放在一起才能使函式成為內聯,僅將inline方在函式宣告前不起任何作用。所以inline函式在類體內定義的話直接加inline。如果在類體內宣告,在類外定義,在類外定義出必須加inline關鍵字,而在宣告處為了說明是inline函式可以選擇性加。
2.inline成員函式應該與相應的類定義在同乙個標頭檔案中。
3.題7_27const成員函式的返回型別是const,所以這裡的函式返回型別要加const,不然沒法把乙個const物件繫結到沒有const修飾的變數上。
const
srceen &dispaly(ostream ou)
const
//返回不加const 錯誤
4.即時兩個類的成員列表完全一致,它們也是兩個不同的型別。
5.對於類的宣告(如class a;),我們也可以僅僅宣告類而暫時不定義它; 它向程式說明了該名字是一種類型別,在宣告後定義前該類是個不完全型別,這樣的類只可以:1定義指向該類的指標或引用,2可以宣告(不能定義)以該類為引數型別或返回型別的函式。
而在我們建立該類的物件時必須被定義過。
6. 每個類負責控制自己的友元類或友元函式。
7. 普通的資料和函式成員只能由物件,引用或者指標使用成員訪問運算子來訪問,而對於類型別成員則使用作用域運算子::訪問。
8.乙個類就是乙個作用域,在類的外部,成員的名字被隱藏起來了;當我們在類的外部定義成員函式時必須提供類名和函式名。
9.在類中定義時,先編譯類成員等類全部可現時,在編譯類的成員函式。所以成員函式可以隨意訪問類的成員而不用在意類成員定義的位置。
10.成員函式的變數名字查詢:由內而外,自上向下 。由內而外的順序:1在成員函式內查詢;2若1沒有查到則在類內繼續查詢;3 如果類內也沒有查詢到,在類的之前的作用域查詢。(關於3 若成員函式在類外定義,則按成員函式之前的作用域內查詢。)
11.如果沒有在建構函式的初始值列表中顯示地初始化成員,該成員將在建構函式之前執行預設初始化。有時候我們可以忽略資料成員初始化和賦值之間的差異,但並非總能這樣。如果成員是const或者引用的話,必須將其初始化。我們初始化const或者引用型別的資料成員的唯一機會就是通過建構函式列表初始值。
12. 建構函式初始值列表中成員的初始化順序
取決於它們在類定義中的出現順序,與前後位置無關。
13. 最好令建構函式初始值的順序與成員宣告一致,也盡量避免使用某些成員初始化其他成員。
習題: 7.28 答:導致後面的函式呼叫都是在其前面生成的物件副本上操作,即第二次呼叫diaplay時不會輸出'#'。
7.29 答: 可以看到因為在副本上的操作沒有改變物件本身,所以第二次列印不一樣。
# srceen 返回
'&' ******************xx#***x
******************xx#***x
^^^#不返回 '&'
******************xx#***x
************************x
7.30 答:看個人喜好吧,用this指示明確,不易出錯,不用this**簡短。
7.32 答:
friend
void
window_mgr::clear
(screenindex);
7.33 答:pos 型別無法識別。
screen::pos
screen::size
()const
7.34 答:出錯,pos未定義。
7.35 答:按照知識點10,很好判斷;最後乙個函式的返回型別與返回值型別不匹配,應該在返回型別處加exercise::
7.36 答:rem(base%j)初始化時,base還沒定義,出錯修改如下:
struct
x int base, rem;
};7.37 答:(a)第乙個呼叫第三個建構函式;(b)第二個呼叫第乙個建構函式。(c)第三個呼叫第乙個 "9-99..9"重新賦值覆蓋掉0;
7.38 答:sales_add(istream &is = cin)
7.39 答:出錯,無法選擇哪個使用。
7.40 答:(汽車) 資料成員:顏色,品牌,重量,載人量等等。
程式題:
題:7.27(.h)
#include
#include
using
namespace
std;
class
srceen
//將視窗字串的內容全部初始化為『c』
char
get ()
//顯示當前游標處字元
inline
char
get(pos r, pos c)
const
inline
srceen& move(pos , pos);
//移動游標函式
inline
srceen& set(
char);
inline
srceen& set(pos, pos,
char);
//過載輸出函式
srceen &display(ostream &ou)
const
srceen& display(std::ostream& os)
const
private
: pos cursor;
pos height, width;
// 螢幕的高度和寬度
std::string contents;
void
do_display(ostream& ou)
const;
inline
srceen &srceen::move(pos r, pos c)
inline
srceen& srceen::set(
charc)
inline
srceen& srceen::set(pos r, pos col,
charc)
7.27(.cpp)
#include
"screen2.h"
intmain()
題:7.31
#include
#include
using
namespace
std;
classx
y *yc ;
private:
intx;
inty; };
classy
x xc;
private:
intx;
inty; };
c primer 第七章 類
const更大的作用是可以修飾函式的引數,返回值,定義體。1.用const 修飾函式的引數 如果引數作輸出用,不論它是什麼資料型別,也不論它採用 指標傳遞 還是 引用傳遞 都不能加const修飾,否則該引數將失去輸出功能。const 只能修飾輸入引數 如果輸入引數採用 指標傳遞 那麼加const修飾...
C Primer 第七章 類
成員函式 宣告在類內,定義可內可外,定義在類內則是隱式內聯函式 在成員函式內部,可以直接使用呼叫該函式的物件的成員 類外部定義的成員的名字必須包含所屬類名 this本身是乙個常量指標,預設情況下指向非常量版本 在引數列表後加const可以修改this指向常量型別 編譯器首先編譯成員的宣告,然後才輪到...
C Primer 第七章 類
7.2 訪問控制與封裝 7.2.1 訪問說明符 7.2.2 友元 7.3 類的其他特性 7.4 類的作用域 7.5 建構函式高階 7.6 類的靜態成員 類的基本思想 封裝在成員函式內部,任何對類成員的直接訪問都被看做this的隱式掉用,也就是當我們使用成員變數bookno的時候,實際上隱式的使用了t...