使用一個并不指向T類型的T*將是一場災難。因此,在C++中,如果從一個void*得到一個T*,你必須進行顯式轉換。舉例來說,要得到上列程序的這個令人別扭的效果,你可以這樣寫:
int* pp = (int*)q;
或者使用一個新的類型造型,以使這種沒有檢查的類型轉換操作變得更加清晰:
int* pp = static_cast<int*>(q);
造型被最好地避免了。
在C語言中,這種不安全的轉換最常見的應用之一,是將malloc()的結果賦予一個合適的指針。例如:
int* p = malloc(sizeof(int));
在C++中,使用類型安全的new操作符:
int* p = new int;
附帶地,new操作符還提供了勝過malloc()的新特性:
new不會偶然分配錯誤的內存數量;
new會隱式地檢查內存耗盡情況,而且
new提供了初始化。
舉例:
typedef std::complex<double> cmplx;
/* C風格: */
cmplx* p = (cmplx*)malloc(sizeof(int)); /* 錯誤:類型不正確 */
/* 忘記測試p==0 */
if (*p == 7) { /* ... */ } /* 糟糕,忘記了初始化*p */
// C++風格:
cmplx* q = new cmplx(1,2); // 如果內存耗盡,將拋出一個bad_alloc異常
if (*q == 7) { /* ... */ }
我如何定義一個類內部(in-class)的常量?
如果你需要一個通過常量表達式來定義的常量,例如數組的范圍,你有兩種選擇:
class X {
static const int c1 = 7;
enum { c2 = 19 };
char v1[c1];
char v2[c2];
// ...
};
延伸閱讀
文章來源于領測軟件測試網 http://www.kjueaiud.com/