C++ 的加強主要表現在:類型的加強、面向對象支持 1、C++改進 C++更強調語言的實用性,所有的變數都可以再需要使用的時候再定義,C語言中的變數都必須在作用域開始的位置定義 C++ int c = 0; for (int i = 1; i register 關鍵字請求編譯器將局部變數存儲與寄存器 ...
C++ 的加強主要表現在:類型的加強、面向對象支持
1、C++改進
C++更強調語言的實用性,所有的變數都可以再需要使用的時候再定義,C語言中的變數都必須在作用域開始的位置定義
int c = 0;
for (int i = 1; i < 3; i++)
{
for (int j = 1; j < 3; j++)
{
c += i * j;
}
}
register 關鍵字請求編譯器將局部變數存儲與寄存器中
在C++中依然支持
register
關鍵字C++ 編譯器有自己的優化方式
C語言中無法獲取
register
變數的地址C++中可以取得
register
變數的地址C++編譯器發現程式中需要取
register
變數的地址時,register
對變數的聲明變得無效早期的C語言編譯器不會對代碼進行優化,因此
register
變數是一個很好的補充
2、同名變數的處理
在C語言中,重覆定義多個同名的全局變數是合法的。C語言中多個同名的全局變數最終會被鏈接到全局數據區的同一個地址空間上。
在C++中,不允許定義多個同名的全局變數。
3、struct
關鍵字的加強
C語言中的struct定義了一組變數的集合
C語言中的struct定義的標識符並不是一種新的類型
C++中的struct用於定義一個全新的類型
// C語言
typedef struct _tag_student Student;
// 將struct _tag_student類型起了一個別名Student
struct _tag_student{
const char * name;
int age;
}
// C++
// struct定義一個全新的類型
struct Student
{
const char * name;
int age;
};
4、小思考
int f()
與int f(void)
的區別:有沒有區別,要看用什麼編譯器
- 如果用C語言編譯器,前面的函數類型是返回值為
int
,接收參數是任意個數參數,後面的函數表示返回值為int
,不接收任何參數 - 在C++中,這兩種寫法沒有區別
5、預設類型
C++中所有的標識符都必須顯示地聲明類型
C語言中地預設類型在C++中是不合法的
f(i)
{
printf("i = %d\n", i);
}
g()
{
return 5;
}
在C語言中:
int f()
表示返回值為int
, 接收任意參數的函數f(void)
表示返回值為int
的無參函數
在C++中:
int f()
和int f(void)
具有相同的意義,表示返回值為int
的無參函數
C++中無預設類型,如果沒有參數,就是不接受任何參數,int f(void)
只是為了相容C語言
C++ 不接受無返回值類型的函數,不允許預設類型
#include <stdio.h>
// c++中,定義了一個新的類型Student
struct Student
{
const char* name;
int age;
};
// C++中有問題,不合法
f(i)
{
printf("i = %d\n", i);
}
// C++不合法
g()
{
return 5;
}
int main(int argc, char *argv[])
{
Student s1 = {"Delphi", 30};
Student s2 = {"Tang", 30};
f(10);
printf("g() = %d\n", g(1,2,3,4,5));
return 0;
}
6、總結
C++更強調實用性,可以在任意的地方聲明變數
C++中的register只是一個相容C的作用
C++編譯器能夠更好地進行優化
C++中地任意標識符都必須顯示地指明類型