c++ 可以這麼做是因為插入了某一段程式碼,
並在某個時候去執行這段程式碼,
所以可以這麼做是要付出某些代價的。
global object 就是用這樣的方式喚起 ctor。
想知道整個詳細的過程可以看看這篇:
http://descent-incoming.blogspot.tw/2012/09/c-c-global-variable-initialize.html
如果你有興趣這個技術, 可以參考這幾篇文章:
http://descent-incoming.blogspot.tw/2015/12/c-runtime-article-content.html
用個簡單的說法:
c++ 會插入一個 function global_a
global_a 會去作 b=a 這件事情。
而 c++ runtime library 會有一段程式碼去呼叫 global_a()
這就是 c++ 可以做到而 c 做不到的祕密。
也就是 c++ 被人家詬病總是在程式員不知道的地方插入很多程式碼,
是個黑箱。
※ 引述《NaiveRed (天真紅)》之銘言:
: 開發平台(Platform): (Ex: VC++, GCC, Linux, ...)
: Dev c++,VS
: 問題(Question):
: 一開始是遇到了這個問題
: int a = 10;
: int b = a;
: int main(){return 0;}
: 在C是不行的,錯誤訊息: initializer element is not constant
: C++則沒問題
: 所以我改成
: const int a = 10;
: int b = a;
: int main(){return 0;}
: 依舊是不行
: 查了一下知道了大概的理由,但還是有點不知所以
: 看完後的理解是:
: C在初始化全域變數時需要constant expressions,因為他是存在Data segment
: 然後在C++初始化全域變數時則不需要
: 至於加了const後還是不行則是因為在C裡不算是標準的constant expressions
: 他需要compile-time constant(全域變數是在compile time初始化的)
: (以上是從stackoverflow不同回答拼湊出來的想法
: 不知道有沒有哪裡理解錯?或是能幫我多做補充的
: 謝謝!