int i1 = 1;
int i2(1);
int i3 = int(1);
int *pi = new int(1);
i1、i2、i3三種寫法完全相同。
From ISO C++11 § 8.5/13
The form of initialization (using parentheses or =) is generally insignificant, but does matter when the initializer or the entity being initialized has a class type; see below. If the entity the notalized has a class type; see below。 >expression-list in a parenthesized initializer shall be a single expression.
根據標準的意思,對於基本類型
來說,它不是一個類別類型(class type),所以使用圓括號或等號進行初始化的效果是一樣的。 int
關於
int i = int();(註:會被當作函數宣告)int i();為什麼的值初始化為i的問題,標準中其實已經說了:0
From ISO C++11 § 8.5/16
The semantics of initializers are as follows. ...
— If the initializer is (), the object is value-initialized. ...
對於
型別 value-initialize 的意思就是初始化為int。 0
2. 型別轉換運算子
// From ISO C++11 § 12.3.2/1
struct X {
operator int();
};
void f(X a) {
int i = int(a);
i = (int)a;
i = a;
}
int()
這種格式據我所知出現在兩種情況中,一種是在int
類型的變數初始化的時候,另一種是在類別中定義型別轉換運算子(type conversion operator )的時候。不知道題主想問的是哪一種,就都簡單說一下吧。1.
int
型態的變數初始化
根據標準的意思,對於基本類型i1
、i2
、i3
三種寫法完全相同。來說,它不是一個類別類型(class type),所以使用圓括號或等號進行初始化的效果是一樣的。
關於int
對於int i = int();
(註:會被當作函數宣告)int i();
為什麼的值初始化為i
的問題,標準中其實已經說了:0
型別 value-initialize 的意思就是初始化為
2. 型別轉換運算子int
。0
把
X::operator int()
的型別從a
轉換成X
。int
至於最早有標準出現是什麼時候就不清楚了,題主如果有興趣可以自己去調查一下:)
我沒記錯的話,c++03,內建型別的值初始化。