類和物件常見問題
const成員函式:
const 成員函式可以使用類中的所有成員變數,但是不能修改它們的值,這種措施主要還是為了保護資料而設定的。const 成員函式也稱為常成員函式。
行內函數:
為了消除函式呼叫的時空開銷,C++ 提供一種提高效率的方法,即在編譯時將函式呼叫處用函式體替換,類似於C語言中的巨集展開。這種在函式呼叫處直接嵌入函式體的函式稱為行內函數(Inline Function),又稱內嵌函式或者內建函式。
注意 :要在函式定義處新增 inline 關鍵字,在函式宣告處新增 inline 關鍵字雖然沒有錯,但這種做法是無效的,編譯器會忽略函式宣告處的 inline 關鍵字。類的成員函式預設時行內函數。
友元函式:
1.友元函式:
藉助友元(friend),可以使得其他類中的成員函式以及全域性範圍內的函式訪問當前類的 private 成員。
友元函式可以是不屬於任何類的非成員函式,也可以是其他類的成員函式。友元函式可以訪問當
前類中的所有成員,包括 public、protected、private 屬性的。friend 函式不僅可以是全域性函式
(非成員函式),還可以是另外一個類的成員函式。友元類中的所有成員函式都是另外一個類的友元函式。
例如:
public:
friend void show(Student *pstu);
2.友元類
不僅可以將一個函式宣告為一個類的“朋友”,還可以將整個類宣告為另一個類的“朋友”,這就是友元類。友元類中的所有成員函式都是另外一個類的友元函式。
注意:友元的關係不是雙向的,也不能傳遞
——————————————————————————————————————————————————————————
static 成員變數:
static 成員變數不屬於某個類,是屬於全域性的,在外部初始化,必須在類外初始化,而且不佔物件的空間
常考題:
如下程式碼:
class AA {}; AA f (AA a) { return a ; } void Test1 () { AA a1 ; a1 = f(a1); } void Test2 () { AA a1 ; AA a2 = f(a1); } void Test3 () { AA a1 ; AA a2 = f(f(a1)); }
問題如下:
Test1中呼叫了 2 次AA的拷貝建構函式, 1 次AA的賦值運算子函式的過載。 Test2中呼叫了 2 次AA的拷貝建構函式, 0 次AA的賦值運算子函式的過載。 Test3中呼叫了 3 次AA的拷貝建構函式, 0 次AA的賦值運算子函式的過載。
做這類題記住一個原則:
傳參,用類返回生成臨時變數會呼叫拷貝構造
如果是初始化,如 date d2=d1 編譯器會優化,不會呼叫賦值運算子過載
如果是賦值,如d2=d1,就不會優化,就會呼叫賦值運算子過載