C與C++的差異
相對於c語言,c++語言增加的主要特性包括類、過載、派生、虛擬函式、模板以及異常處理。 但在進一步討論這些新特性之前,我們需要討論這兩種語言之間的一些小差異。
一、註釋
c++語言支援單行註釋。單行註釋由//開始,在之後的第一個換行符處結束。單行註釋比c語言的註釋更安全,因為他們不會意外丟掉註釋結束的標記,但c語言的註釋在c++中任然是合法的。
二、標記與型別名
在c++語言中用於標識特定的結構、聯合或列舉的名字會自動被認為是型別名。因此我們將
typedef struct {double re, im;} complex;
簡單寫成
struct complex{double re, im;} ;
三、不帶引數的函式
在宣告和定義一個不帶引數的c++函式時,可以不使用void:
void draw(void); //no arguments void draw();//no arguments either
四、預設實際引數
c++語言允許函式的實際引數有預設值。例如,下面的函式可以顯示任意個數的換行符。如果呼叫時沒有提供任何實際引數函式會顯示一個換行符。
void new_line(int n=1) { while (n-- > 0) putchar('\n'); }
呼叫new_line函式時,可以提供一個實際引數,也可以不提供實際引數。
new_line(3);//print 3 blank lines new_line();//print 1 blank line by default
五、引用引數
c語言規定實際引數是按值傳遞的,這使編寫那些需要修改作為實際引數提供的變數(除了陣列)都非常困難。為了迴避這個限制,我們只能傳遞指向該變數的指標。對於一個將兩個變數的內容交換的函式,其C語言的實現大致如下:
void swap(int *a, int *b) { int temp; temp = *a; *a = *b; *b = temp; }
當swap函式被呼叫時,其引數應該是指向變數的指標:
swap(&i, &j);
雖然這種方式可以正常工作,但它使用起來並不方便,程式碼也不易理解,還容易出錯。c++語言在這方面做一些改進,允許實際引數被宣告成引用,而不是指標。下面是將a和b宣告為引用後swap函式的樣子:
void swap(int &a, int &b) { int temp; temp = a; a = b; b = temp; }
當swap函式被呼叫時,不需要在實際引數前加&運算子:
swap(i, j);
在swap的函式體中,a和b被分別理解為i和j的別名。語句temp=a確實會將i的值複製到temp中。語句a=b也確實將j的值複製到i中。同樣,b=temp將temp的值複製給j。
六、動態儲存分配
c程式可以使用函式malloc、calloc、realloc動態分配和釋放記憶體。雖然c++程式仍然可以使用這些函式,但更好的做法是使用new和delete。 new和delete是運算子,不是函式。new用來分配空間,delete用來釋放分配的空間。new的運算元是一個型別說明符:
int *int_ptr , *int_array; int_ptr = new int; int_array = new int[10];
當無法分配所要求的記憶體時,new會返回空指標。delete需要用一個指標作為他的運算元:
delete int_ptr; delete [ ] int_array;