以下廢話只是要表達自己是個初學者,如果問了笨問題還請海涵
=====================================================================
大家好 先簡述一下我程式語言菜鳥的歷程
我接觸程式語言是大學的課程,人生第一個程式是c
但是教授為了授課內容很快就跳c++(至少上課範例程式都直接存成cpp)
但可能是因為學店的關係吧,其實也沒講多少深入的東西
後來大三進入java的世界,然後深入學習java下的OO概念。
我其實不知道自己學到怎樣的程度,只能說比較基本的沒問題,
reflect以後的比較沒在碰。
一個月前借了《c++全方位學習》回來摸索c++,最近才讀到類別的章節
發現有些東西跟java的OO概念有點衝突,好不適應XDD 必須要放空去學習
=====================================================================
1.為何要賦予可實作成員函式於定義類別之外(想請問這個動作有術語嗎)?
class CRectangle {
int x, y;
public:
void set_values (int,int);
int area (void) {
return (x*y);
}
}
void CRectangle::set_values (int a, int b) {
x = a;
y = b;
}
為什麼成員函數不在定義類別的時候就決定好,而要在定義類別之外才補完?
是為了提供類似java OO的抽象函數的概念嗎?
(例如定義一個類別叫做動物,動物會"移動",
但實際上怎麼移動是由子類別去實作,所以
動物類別在移動這個成員函式就先不實作。
請問cpp有這個彈性的原因如上述嗎?)
2.inline 好像很棒,預設為何不直接inline?
根據網路資料裏頭提到(大學課程的教材:C++物件導向及增進效率程式技巧)
在 class 內部直接定義完整的函數,和只定義函數的原型而把具體實現放在 class
外部的唯一區別在於,在第一種情況中,編譯器(compiler) 會自動將函數作為
inline 考慮,而在第二種情況下,函數只是一般的 class 成員函數。
然後我又去查inline是什麼東東,以我的了解是:
編譯器會對加上inline的函式進行評估,
當展開函式內容比呼叫函式所花的成本還小時就會直接展開函式
而編譯器也會評估,如果展開後的效益不夠,即便函式加上inline
編譯器也不會進行展開。
如果以上我的了解是正確的
那為何cpp不預設所有函式都是inline的作法?
反正展開的效益有編譯器為我們把關來決定展開與否不是嗎?
為什麼會像現在這樣要由使用者自己決定是否要加inline呢?