C++繼承了所有的C特性,并且提供了更豐富的語法和特性(OOP支持、模板支持等),并且擁有和C語言同樣出色的運行效率,針對C語言的固有問題,C++做出了如下的升級:
- 所有變數都可以在需要使用時再定義(C99支持)
- 忽略register關鍵字,仍然可以取得register變數的地址
- 不允許定義多個同名的全域變數(C允許這樣做,并且這些變數最侄訓被鏈接到同一塊記憶體上)
- struct關鍵字現在可以用來定義一個全新的型別(C只是定義一個識別符號,不是一種型別)
- 函式宣告中的引數串列為空則表示void(在C中,可以傳入任意多的引數)
- 所有的識別符號都必須顯示宣告型別(在C中,默認型別是int)
一、所有變數都可以在需要使用時再定義
在C99標準之前,C函式中的所有變數定義都必須要寫在函式的開頭:
int main()
{
return 0;
}
void func()
{
int a, b, i;
// 運算代碼...
a = 10;
// 運算代碼...
b = 20;
// 運算代碼...
for(i = 0; i < 10; i++) {
// 運算代碼...
}
}
這樣做的問題在于:如果函式非常復雜,需要使用的變數很多,那么很難根據背景關系來判斷變數的含義,對于代碼的書寫和閱讀都很不利,因此,自C99標準開始,C支持在變數需要使用時再定義和初始化:
void func()
{
// 運算代碼...
int a = 10;
// 運算代碼...
int b = 20;
// 運算代碼...
for(int i = 0; i < 10; i++) {
// 運算代碼...
}
}
而對于C++,在語言設計之初就已經支持了這個特性,所有的物件都可以在函式中的任意位置定義,
二、忽略register關鍵字,仍然可以取得register變數的地址
在C語言中,register關鍵字用于請求編譯器將變數直接定義在暫存器中(編譯器可能會根據實際情況忽略這個請求),然而,這個功能在C++中是一個雞肋,因此大多數C++不會針對register關鍵字進行特殊優化,
int main(int argc, char *argv[])
{
register int a = 0;
int *pa = &a; // C語言不允許這樣做,但C++可以,
return 0;
}
三、不允許定義多個同名的全域變數
對于老式的C語言編譯器(比如BCC編譯器),允許定義同名的全域變數,并且將它們鏈接到同一塊記憶體上,雖然一些現代化的C編譯器(例如gcc, VC)同樣不允許這樣做,但是這仍然是C的一個黑暗地帶,因此,C++完全禁止了這樣的做法,現在,C++中的同名的全域變數一定會引發編譯錯誤,
int g_v = 1;
double g_v = 2; // 編譯錯誤: 定義同名的全域變數,
int main(int argc, char *argv[])
{
return 0;
}
四、struct關鍵字現在可以用來定義一個全新的型別
在C語言中,struct關鍵字僅僅用于將多個其他資料型別組合在一起,采取一定的對齊方式占用一塊連續的記憶體空間,然而,它定義的只是一個識別符號,無法直接使用這個識別符號來定義變數,而必須要使用型別別名的方式來為這個識別符號定義型別名稱,C++針對struct做了重要的擴充,現在,struct被用來定義型別別,不僅直接定義一個新型別,還支持類相關的寫法(更多的被用于定義POD(Plain Old Data)型別),
struct my_struct
{
int a;
float b;
double c;
};
int main(int argc, char *argv[])
{
// C風格的變數定義,
struct my_struct a;
// C++風格的物件定義,
my_struct c;
return 0;
}
五、函式宣告中的引數串列為空則表示void
在C中,函式宣告中的引數串列如果為空,則意味著該函式可以接受任意多的實參;而在C++中,這種寫法與void等價:
int func()
{
//...
return 0;
}
int main(int argc, char *argv[])
{
func(1, 2, 3, 4/*....*/); // C語言允許這樣做,這些變數在函式呼叫時被壓堆疊,
// C++語言不允許這樣做,因為引數串列被推斷為void,
return 0;
}
六、所有的識別符號都必須顯示宣告型別
C語言中允許使用函式的默認回傳型別和變數的默認型別,然而對此C++有更嚴格的要求,必須顯示地宣告變數的型別,或者使用自動型別推斷(C++11),
// C語言允許這樣做,默認的回傳型別為int,
// C++語言不允許這樣做,必須顯示地指定回傳型別,或者使用自動型別推斷,
func()
{
return 5;
}
// C++允許的做法
int func() // 顯示指定回傳型別
{
return 5;
}
auto func() // 自動推斷回傳型別(C++11)
{
return 5;
}
decltype(auto) func() // 自動推斷回傳型別(C++11)
{
return 5;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/64982.html
標籤:C++
