1、關鍵字
藍色標註為C語言關鍵字,C++繼承了C語言的所有關鍵字,以下紅色標註為C++中含有但C語言沒有的關鍵字(根據c++98中提出C++包含63個關鍵字)
2、原始檔區別
C語言檔案字尾為。c,c++原檔名字尾為。cpp
如果在建立原始檔時什麼都不給,預設是。cpp
3。返回值不同
C語言中,如果一個函式沒有指定返回值型別,預設為int型別,並返回一個隨機數,一般為0XCCCCCCCC
在C++中,如果函式沒有返回值則必須指定為void型,否則編譯不能透過
4、引數列表
在C語言中,函式沒有指定的引數列表時,預設可接收任意多個引數
在C++中,有嚴格的引數型別檢測,沒有引數列表的函式,預設為void,不接收任何引數。
預設引數
預設引數是宣告和定義時函式的引數指定一個預設值。在呼叫該函式時,如果沒有指定實參則採用預設值,否則使用指定的實參。
如下程式碼:
#include
using namespace std;
void test(int a = 1)
{
cout << a << endl;
}
int main()
{
test();
test(10);//輸出的結果是1
return 0;//函式輸出結果是10
}
而預設引數是分為兩類的,一類是全預設,一類是半預設。
首先是全預設,全預設引數所有引數都有預設值,如果沒有手動傳參,那麼編譯器會使用預設引數列表中的引數。但是這裡值得注意的是,如果傳參的時候只傳了部分引數,那麼該值會被從左至右匹配。
程式碼示例:
#include
using namespace std;
void test(int a = 1,int b = 2, int c = 3)
{
cout << a << “ ” << b << “ ” << c << endl;
}
int main()
{
test();//1 2 3
test(10);//10 2 3
test(10, 20);//10 20 3
test(10, 20, 30);//10 20 30
return 0;
}
半預設引數程式碼演示:
void test(int a ,int b = 2, int c = 3)
{
cout << a << “ ” << b << “ ” << c << endl;
}
void test1(int a, int b, int c = 3)
{
cout << a << “ ” << b << “ ” << c << endl;
}
其中test函式至少傳一個引數,test1函式至少傳兩個引數,函式才可以正常執行。
注意:
帶預設值的引數必須放在引數列表的最後面。因為傳參是從右向左的。
預設引數不能同時在函式宣告和定義中出現,只能二者留其一。
預設值必須是常量或者全域性
變數。
C語言並不支援預設。
5、C++支援函式過載,C語言不支援
在實際開發中,有時候我們需要實現幾個功能類似的函式,只是有些細節不同。例如希望交換兩個變數的值,這兩個變數有多種型別,可以是 int、float、char、bool 等,我們需要透過引數把變數的地址傳入函式內部。在C語言中,程式設計師往往需要分別設計出三個不同名的函式,其函式原型與下面類似:
void swap1(int *a, int *b); //交換 int 變數的值
void swap2(float *a, float *b); //交換 float 變數的值
void swap3(char *a, char *b); //交換 char 變數的值
void swap4(bool *a, bool *b); //交換 bool 變數的值
但在C++中,這完全沒有必要。C++ 允許多個函式擁有相同的名字,只要它們的引數列表不同就可以,這就是函式的過載(Function Overloading)。藉助過載,一個函式名可以有多種用途。
引數列表又叫引數簽名,包括引數的型別、引數的個數和引數的順序,只要有一個不同就叫做引數列表不同。
#include
using namespace std;
//交換 int 變數的值
void Swap(int *a, int *b){
int temp = *a;
*a = *b;
*b = temp;
}
//交換 float 變數的值
void Swap(float *a, float *b){
float temp = *a;
*a = *b;
*b = temp;
}
//交換 char 變數的值
void Swap(char *a, char *b){
char temp = *a;
*a = *b;
*b = temp;
}
//交換 bool 變數的值
void Swap(bool *a, bool *b){
char temp = *a;
*a = *b;
*b = temp;
}
int main(){
//交換 int 變數的值
int n1 = 100, n2 = 200;
Swap(&n1, &n2);
cout< //交換 float 變數的值 float f1 = 12。5, f2 = 56。93; Swap(&f1, &f2); cout< //交換 char 變數的值 char c1 = ‘A’, c2 = ‘B’; Swap(&c1, &c2); cout< //交換 bool 變數的值 bool b1 = false, b2 = true; Swap(&b1, &b2); cout< return 0; } 執行結果: 200, 100 56。93, 12。5 B, A 1, 0 過載就是在一個作用範圍內(同一個類、同一個名稱空間等)有多個名稱相同但引數不同的函式。過載的結果是讓一個函式名擁有了多種用途,使得命名更加方便(在中大型專案中,給變數、函式、類起名字是一件讓人苦惱的問題),呼叫更加靈活。 在使用過載函式時,同名函式的功能應當相同或相近,不要用同一函式名去實現完全不相干的功能,雖然程式也能執行,但可讀性不好,使人覺得莫名其妙。 注意,引數列表不同包括引數的個數不同、型別不同或順序不同,僅僅引數名稱不同是不可以的。函式返回值也不能作為過載的依據。 函式的過載的規則: 函式名稱必須相同。 函式的返回型別可以相同也可以不相同。 僅僅返回型別不同不足以成為函式的過載。 6、指標和引用 C語言中函式傳參方式有兩種:傳值和傳址 以傳值方式,在函式呼叫過程中會生成一份臨時變數用形參代替,最終把實參的值傳遞給新分配的臨時形參。它的優點是避免了函式呼叫的副作用,卻無法改變形參的值。如果要改變實參的值,只能透過指標傳遞。 指標可以解決問題,但是不安全,因此在C++中引入了引用。 引用:引用不是新定義的一個變數,他是原變數的一個別名,編譯器不會為引用變數開闢空間,它和他引用的變數共用同一塊記憶體空間。 型別& 變數(物件名)=引用變數 int &num1=num0; 引用特性; 1、引用定義時必須初始化 2、一個變數可以有多個引用 3、引用一旦繫結一個實體就不能改變為其他變數的引用 //指標和引用的區別 引用不可以為空,但指標可以為空 引用不可以改變指向,對一個物件”至死不渝”;但是指標可以改變指向,而指向其它物件 引用的大小是所指向的變數的大小,因為引用只是一個別名而已;指標是指標本身的大小,4個位元組。 指標和引用可參考QQ群: 862850024 7、名稱空間 在C++中,變數、函式和類都是大量存在的,這些變數、函式和類的名稱將都存在於全域性名稱空間中,會導致很多衝突,使用名稱空間的目的是對識別符號的名稱進行本地化,以避免命名衝突或者名字汙染,namespace關鍵字的出現就是解決這種問題。而C語言中沒有。 8、輸入與輸出 cout代表c++的輸出流 cin代表c++的輸入流 它們都是在標頭檔案“iostream”中定義。 “cout”必須與”<<”一起使用,“<<”起到插入的作用。 在一條語句中可以多次使用“<<”輸出多個數據。 如:cout< #include using namespace std; int main() { int a,b; cout<<“請輸入a,b的值”< cin>>a>>b; cout<<“輸出a的值”< return 0; }