從C過渡到C

2021-08-05 22:47:52 字數 4623 閱讀 1890

>     c plus plus -- c語言的超級/帶class的c語言

c++可以完全引用c/c不能直接呼叫c++

### 案例:輸出hello world

* 源**:`helloworld.cpp`

``````

#include

using namespace std;

int main()

``````

* 編譯:`g++ helloworld.cpp -o helloworld`

* 執行:`./helloworld`

* 結果:`hello world`

從`helloworld.cpp`,看c++與c的基本區別:

1. 檔案字尾`.cpp`

2. 標頭檔案`#include `

3. 命名空間 `using namespace std;`

4. 標準輸出`cout`、輸出運算子`<<`、換行`endl`

5. 編譯工具`g++`

> `g++`安裝:`yum install gcc-c++`

---#### 1.原始檔字尾

* c/c++字尾名區別

|c|c++|

|:-|:-|

|`*.c`|`*.cpp` `*.cc` `*.cxx`|

* 不同編譯器c++字尾名區別

|平台|可用字尾名|

|:-|

|unix|`*.c`, `*.cc`, `*.cxx`, `*.c`|

|gnu c++|`*.c`, `*.cc`, `*.cxx`, `*.cpp`, `*.c++`|

|borland c++|`*.cpp`|

|microsoft visual c++|`*.cpp`, `*.cxx`, `*.cc`|

---#### 2.引用標頭檔案

c++標頭檔案使用c標準庫,在c標準庫檔名前加上字母`c`,並且省略字尾名`.h`,例如:

|c|c++|

|:-|:-|

|`#include `|`#include ` /`#include `|

|`#include `|`#include `|

|`#include `|`#include `|

|`#include `|`#include `|

*有些c++編譯器同時支援以上兩種標頭檔案,但有些不。請使用c++標準方式*

---#### 3.函式過載(overload)

實驗:以下c與c++的編譯執行結果

* `printf.c`

```#include

void printf()

int main()

```gcc printf.c -o print

print.c:3:6: error: conflicting types for 『printf』

void printf()

int main()

```編譯執行成功

函式過載:函式名相同只有引數(個數或者型別)不相同。

|c|c++|

|:-|:-|

|不支援過載|支援過載|

---#### 4. 命名空間

實驗:以下c的編譯結果

* `scope.c`

```#include

void test()

void test()

int main()

```gcc scope.c -o scope

scope.c:9:6: error: redefinition of 『test』

void test()

``````

* 引用命名空間

``````

using namespace 空間名;

``````

* 標準命名空間`std`

``````

using namespace std;

``````

c++命名空間處理方式

``````

#include

namespace scope1

}namespace scope2

}int main()

```* 命名空間巢狀

```namespace a }}

```在命名空間`a`外訪問

```a::test1();

a::b::test2();

a::b::c::test3();

```在命名空間`a`內訪問

```test1();

b::test2();

b::c::test3();

```在命名空間`b`內訪問

```test1();

test2();

c::test3();

```在命名空間`c`內訪問

```test1();

test2();

test3();

``````

namespace a }}

```在命名空間`a`外訪問

```a::test();

a::b::test();

a::b::c::test();

```在命名空間`a`內訪問

```test();

b::test();

b::c::test();

```在命名空間`b`內訪問

```test();

c::test();

```在命名空間`c`內訪問

```test();

```> 命名空間可以巢狀,類定義是否巢狀?結構體/聯合體定義是否可以巢狀?函式定義是否可以巢狀?復合語句(if-else for while do-while)是否可以巢狀?

```class a;

}```

```void test1()

}```

* 命名空間可以重複定義

```namespace a

namespace a

```全域性命名空間/預設命名空間/匿名命名空間:所有沒有定義命名空間的函式都在全域性命名空間內。

比如: main()函式,使用。

命名空間沒有生存週期,作用域是全域性。

命名空間可以限制所有識別符號(變數名、函式名、類名、空間名、型別名(typedef)),巨集定義不受命名空間限制。

---#### 5. 型別

* 新增基本型別`bool`--`true`/`false`

* `password.c`

```#include

int main()

```* `password.cpp`

```#include

#include

using std::cout;

using std::cin;

using std::endl;

int main()

```* 新增自定義型別`class`

詳細資訊參見:類與物件章節

* c++的新增關鍵`and` `or` `not`

```if(a>b && cb and c#### 6. 思想

|c|c++|

|:-|:-|

|面向過程|物件導向/基於物件、模板/泛型程式設計|

何為面向過程?何為物件導向?

* 面向過程:強調如何處理,通常是自下而上。

* 物件導向:強調執行處理的物件,通常是自上而下。

> 面向過程與面向過程、廚師與老闆

#### 7. 動態記憶體

* 基本型別的動態記憶體

* `dynamic_mem.c`

```#include

#include

int main()

```* `dynamic_mem.cpp`

```#include

int main()

```標量:單個值(基本型別(int、float、char)/復合型別(陣列、指標、引用))/向量:多個值(類、結構體、聯合體等)

> `new` `delete`都是關鍵字,用於申請/釋放堆記憶體。

動態記憶體區別

|c|c++|

|:-|:-|

|`malloc()`/`free()`|`new`/`delete`|

*c++仍然可以使用`malloc()`/`free()`,但是不建議這麼做。*

問題:

* `malloc()`申請記憶體,是否可以使用`delete`銷毀記憶體?

* `new`申請記憶體,是否可以使用`free()`銷毀記憶體?

答:不能,malloc /free主要為了相容c,new和delete 完全可以取代malloc /free的。malloc /free的操作物件都是必須明確大小的。而且不能用在動態類上。new 和delete會自動進行型別檢查和大小,malloc/free不能執行建構函式與析構函式,所以動態物件它是不行的。當然從理論上說使用malloc申請的記憶體是可以通過delete釋放的。不過一般不這樣寫的。而且也不能保證每個c++的執行時都能正常。

> 注意:`delete`和`free()`動態記憶體後,指標指向`null`

從C過渡到C

案例 輸出hello world include using namespace std int main int main 函式過載 函式名相同只有引數 個數或者型別 不同。命名空間 include namespace scope1 namespace scope2 int main 命名空間的作...

從C過渡到C

作業系統和驅動程式都是c寫的,學好c足夠了。c 在應用層用得多,學嵌入式沒必要學 linux大神都認為c 一無是處,還學它幹嘛 我以後就做驅動開發,沒精力也沒必要學習c 但是說,軟體這個行業是飛速發展的,只靠單一 一種語言並不能支撐整個工作生涯,而且只用單一 一種語言很快就會走進瓶頸,所以我們要開闊...

從C語言過渡到C 之基本變化

說到c 和c語言的區別,大部分人都會想到物件導向和面向過程。然而這種說法並不準確。物件導向和面向過程指的是兩種不同的程式設計思想,而c 與c是兩種程式語言,難道c 就不能用於面向過程去解決問題嗎,當然可以。而物件導向的設計思想也可以用到c語言中去,我之前的文章就涉及過這方面的知識。我們這個系列就是要...