C語言與C++到底有哪些區別?

1、關鍵字

C語言與C++到底有哪些區別?

藍色標註為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;

}