問(wèn)題描述
什么是 C++ 中對(duì)象的動(dòng)態(tài)初始化?
請(qǐng)用一個(gè)簡(jiǎn)單的例子來(lái)解釋...
Please explain with an simple example...
推薦答案
動(dòng)態(tài)初始化是在編譯時(shí)不知道初始化值.它在運(yùn)行時(shí)計(jì)算以初始化變量.
Dynamic initialization is that in which initialization value isn't known at compile-time. It's computed at runtime to initialize the variable.
示例,
int factorial(int n)
{
if ( n < 0 ) return -1; //indicates input error
else if ( n == 0 ) return 1;
else return n * factorial(n-1);
}
int const a = 10 ; //static initialization
//10 is known at compile time. Its 10!
int const b = factorial(8); //dynamic initialization
//factorial(8) isn't known at compile time,
//rather it's computed at runtime.
也就是說(shuō),靜態(tài)初始化通常涉及常量表達(dá)式(在編譯時(shí)已知),而動(dòng)態(tài)初始化涉及非常量表達(dá)式.
That is, static-initialization usually involves constant-expression (which is known at compile-time), while dynamic-initialization involves non-constant expression.
static int c;//this is also static initialization (with zero)!
來(lái)自 C++ 標(biāo)準(zhǔn) (2003) 的 §3.6.2/1 說(shuō),
§3.6.2/1 from the C++ Standard (2003) says,
具有靜態(tài)存儲(chǔ)持續(xù)時(shí)間的對(duì)象(3.7.1) 應(yīng)為零初始化(8.5) 在任何其他初始化之前發(fā)生.零初始化和用常量初始化表達(dá)式統(tǒng)稱為靜態(tài)初始化;所有其他初始化是動(dòng)態(tài)的初始化.
Objects with static storage duration (3.7.1) shall be zero-initialized (8.5) before any other initialization takes place. Zero-initialization and initialization with a constant expression are collectively called static initialization; all other initialization is dynamic initialization.
所以有兩種初始化:
- 靜態(tài)初始化:要么是零初始化,要么是用常量表達(dá)式初始化
- 任何其他初始化都是動(dòng)態(tài)初始化.
還要注意,同一個(gè)變量可以在靜態(tài)初始化后動(dòng)態(tài)初始化.例如,請(qǐng)參閱此代碼:
Also note that the same variable can be dynamically-initialized after it has been statically-initialized. For example, see this code:
int d = factorial(8);
int main()
{
}
由于 d
是一個(gè)全局變量,它具有靜態(tài)存儲(chǔ).這意味著,根據(jù)§3.6.2.1
,它在靜態(tài)初始化階段被初始化為 0,該階段發(fā)生在任何其他初始化發(fā)生之前.然后,在運(yùn)行時(shí),它使用從函數(shù) factorial()
返回的值動(dòng)態(tài)初始化.
Since d
is a global variable, it has static storage. That means, according to §3.6.2.1
it's initialized to 0 at the static-initialization phase which occurs before any other initialization takes place. Then later, at runtime, it's dynamically-initialized with the value returned from the function factorial()
.
也就是說(shuō),全局對(duì)象可以被初始化兩次:一次是通過(guò)靜態(tài)初始化(即零初始化),然后在運(yùn)行時(shí),它們可以被動(dòng)態(tài)初始化.
That means, global objects can be initialized twice: once by static initialization (which is zero-initialization) and later, at runtime, they can be dynamically-initialized.
這篇關(guān)于c++中對(duì)象的動(dòng)態(tài)初始化是什么?的文章就介紹到這了,希望我們推薦的答案對(duì)大家有所幫助,也希望大家多多支持html5模板網(wǎng)!