以前也沒多注意C和C++有什麼差別,感覺C++沒有類,模板和引用,那麼C++就是C
近幾天特別注意了這方面的問題,發現以前想的還是有問題的。
去掉了類,模板和引用的C++和C還是有一定的差別的。
下面列了幾點還多多指教
函數原型
在C++中函數原型是必須的,而C中是可選的
在C中圓括弧意味著前向原型聲明,但在C++中就意味著函數沒有原型
例如
int test();
int main()
{
int test(4,5);
}
int test(int a,int b)
{
}
在C的舊風格中可以接受的,但是在C++中就會產生一個錯誤
C++允許聲明函數名相同的多個函數,只要他們具有不同的參數表
char常量
char常量在C中被認為int類型的,C++中則被看成是char類型的
例如
char ch=‘A’;
在C中,常量‘A’的字元編碼儲存為一個int值,相同的數值也被儲存在變數ch中,但是在ch中只佔據記憶體中的一個位元組,
在C++中,‘A’和ch都是使用一個位元組
const修飾符
C中全域的const具有外部連結,C++中他具有內部連結
C++中的const double PI=3.14159;
相當於C中的static const double PI=3.14159;
前提兩者都在所有函數的外部
C++的意圖是使得在標頭檔中使用const更加的簡單
C++中可以使用extern使一個const值具有外部連結
兩種語言都可以建立具有內部和外部連結的常量,不同的只是在於預設使用哪種連結
C++中可以使用const value初始化const,但是在C中就不可以
例如
const int a=1;
const int b=2;
const int c =a*b; /*C++合法,C非法*/
結構和聯合
聲明一個帶標記的結構和聯合之後,在C++中就可以使用該標記作為類型名了
struct point
{
int x;
int y;
};
struct point m; /*C合法,C++合法*/
point n; /*C不合法,C++合法*/
在C++中結構名可能與變數名相衝突。
#include <stdio.h>
float point = 10.001;
int main()
{
struct point {int x;int y;};
struct point m = { 2, 4};
printf("%f/n",point); /*C可以,C++不可以*/
return 0;
}
C++把printf()中的point解釋為結構類型而不是外部變數。
struct box
{
struct point {int x;int y;} upperleft;
struct point lowerright;
};
c中可以使用任一結構,c++中使用嵌套結構要求一個特殊的符號::。
strcut box ad; /*C合法,C++合法*/
strcut point dot; /*C合法,C++非法*/
box::point dot; /*C++*/
枚舉
對於枚舉,c++比c更嚴格
使用枚舉enum變數可以做的唯一有用的是為他賦予一個enum變數後和其他的之進行比較;不經過顯式的類型轉換就不可以把int值賦給enum變數,而且也不能遞增一
個enum變數。
enum sample {sage,thyme,salt,pepper};
enum sample season;
season =sage; /*c,c++*/
season =2; /*c warnning,c++ error*/
season =(enum sample) 3; /*C,C++*/
season++; /*C可以,C++ error*/
C++允許聲明是不用關鍵字enum
sample season; /*C非法,C++合法*/
如果一個變數和enum類型有相同名字就會有衝突。
指向void的指標
C,C++可以把任意類型的指標賦值給指向void的指標,
C++中除非使用了顯式的類型轉換,否則不能將指向void的指標賦值給其他類型的指標。
int arg[5]={1,2,3,4,5};
int *pi;
void *pv;
pv = arg; /*C,C++*/
pi = pv; /*C合法,C++非法*/
pi = (int*)pv; /*C,C++*/
C++中可以把衍生類別對象的地址賦值給其他類型的指標,C中不存在。
bool類型
C++中布爾類型是bool,true,false是關鍵字;
C中包含了stdbool.h在可以使用true和false。