作者applecool (noOneKnows)
看板C_and_CPP
標題Re: [問題] 想請問建構子及解構子的疑問?
時間Fri Nov 8 07:22:40 2013
※ 引述《funkyslap (平凡是淋漓盡致的美)》之銘言:
: 問題(Question):
: 1.想請問建構子的作用是不是針對”類別”內所設定的屬性,產生出物件的時候
:
: 做初始化的動作,除了這個作用還有別的嗎(請問我這個觀念是正確的嗎)?
: 例:
我覺得就是這樣沒錯
: 2.之前上課老師寫的順序是這樣,想請問這樣編寫是會有影響還是沒有影響的?
: 例:
: class person
: {
: 建構子;
: 解構子;
: 屬性;
: 行為;
: }
順序應該是不影響程式結果,
不過成員的宣告順序和 private, public 等都會影響行為
只要在建構子的時候不要有順序相依性,
然後沒有指標直接存取 member 的 hard core,調換順序應該不用太擔心
舉例
int a;
int b;
ctor(const int tA) : a(tA), b(a) {}
這樣子 b 會受 a 是否初始化而影響,除了極少數情況外,
一般而言這樣不好,而且也不好維護。
極少數情況包括 b 本來就需要關連到 a,但 b 具有 const 性質或本身是引用,
所以要仔細安排 a, b 的順序,但是要註解清楚
: 問題點:這樣建構子寫在前面是不是編譯會有問題,順序是不是要調整?
: 3.看過建構子帶參數的狀況,什麼情況下會有這種情形出現??
: 可以舉個例子讓我了解嗎??
: 以上問題,謝謝回答,感恩。
如果需要一些外部參數才能初始化本身的 member 的時候,就像上面的 tA
另外希望在很前面就開始執行函數的時候,比如說 main 之前,
可以宣告一個全域變數寫在建構子(常用)
class MyType {
public:
T1 a;
T2 b;
MyType() {
// do something;
}
} my_global_var;
但由於不同全域變數很難保證彼此的初始化順序,
所以也可以把它們收集到同一個 class
透過調整 member 順序來保證初始化順序(依照領域,但大部分少用)。
這是我所知道實務上最簡單的寫法,請參考。
※ 編輯: applecool 來自: 123.110.215.144 (11/08 07:32)
→ diabloevagto:data member初始化的順序是以宣告的順序為主,而不是 11/08 12:32
→ diabloevagto:以initialization list中的順序 11/08 12:32