C 基礎知識篇

2021-08-02 18:32:55 字數 3886 閱讀 6952

1.命名空間

在c++中,識別符號(name)可以是符號常量、變數、巨集、函式、結構、列舉、類和物件等。為了避免在大規模程式設計中以及在程式設計師使用各種各樣的c++庫時,這些識別符號的命名發生衝突,標準c++引入了關鍵字namespace(命名空間),以便更好控制識別符號作用域。

定義格式如下:

namespace 命名空間

例如:定義兩個命名空間aa1,aa2

#include

using

namespace

std;

namespace aa1

using宣告

在c++中,我們可以使用using可以不需要加字首「namespace_name::」的情況下訪問命名空間中的成員。using宣告同其他宣告一樣有乙個作用域,它引入的名字從宣告開始直到其所在的域結束都是可見的。

例如命名空間std,這是最常用的命名空間,標準c++庫中所有的元件都在該命名空間中宣告和定義。

例如:

#include 

using

namespace

std;

int main ()

2.c++基本的輸入輸出流

c++的輸入和輸出功能除了支援c語言的輸入/輸出系統外,還可以有iostream庫提供。最常用的輸入/輸出運算子是「>>」和「<

(1)cin:標準輸入的istream類物件,使使用者能夠從終端讀資料,預設鍵盤。

(2)cout:標準輸出的ostream類物件,使使用者能夠從終端寫資料,預設是螢幕。

(3)cerr:標準錯誤的ostream類物件,cerr輸出程式錯誤,預設是螢幕。

#include 

#include

using

namespace

std;

int main ()

void fun(char j)

int main()

會出現如下的錯誤:

而c++可以實現這樣的函式過載,那麼問題來了,為什麼c++支援函式過載,而c語言不支援呢?

從**的編譯到執行,在vs這種編譯器下,它是系統直接完成了翻譯與鏈結,直接生成了執行結果。

編譯器內部完成了翻譯部分:

1.預處理

1)標頭檔案展開

2)巨集的替換

3)去注釋

4)條件編譯

2.編譯過程:將高階語言轉為組合語言

3.彙編過程:組合語言轉為二進位制程式

鏈結部分:所引用的資料鏈結進來

比如乙個函式的宣告如下:

void fun(int i);

在c語言中,編譯器在編譯後在庫中的名字為_fun

在c++中,編譯器在編譯後在庫中的名字為_function_int

還有乙個函式的宣告如下:

void fun(char j);

在c語言中,編譯器在編譯後在庫中的名字為_fun

在c++中,編譯器在編譯後在庫中的名字為_function_char

在鏈結時,都是找名字進行鏈結的,就比如以上兩個函式,

在c語言中兩個的名字一樣,就會在鏈結中報錯。

c++中它們的名字不一樣,所以就不會報錯。

4.c++預設引數

如果函式說明或函式定義中為形參指定乙個預設值,則稱此函式為帶預設引數的函式。如果在呼叫時,指定了形參相對應的實參,則形參使用實參的值。如果未指定相應的實參,則形參使用預設值,這為函式的使用提供了很大的便利。

例如,函式int可以被說明為:

void init(int x = 1);
如果呼叫語句為init(2),則這個呼叫語句傳遞給形參的值為2,如果呼叫語句為init( ),則傳遞給形參的值為1。

如果函式有多個預設引數,則預設引數必須是從右向左定義,並且在乙個預設引數的右邊不能有未指定預設引數。

例如:

void fun(int a,int b = 1,int c = 4,int d = 5);
這個函式宣告語句是正確的,但是下面的宣告語句是錯誤的:

void fun(int a,int b = 1,int c,int d);

void fun(int a,int b = 1,int c,int d = 5);

預設引數分為全預設引數和半預設引數,例如:

// 全預設引數

int add1 (int a = 0, int b = 0)

// 半預設引數

int add2 (int a, int b = 0)

void test ()

【注意】

1. 帶預設值的引數必須放在參數列的最後面。

2. 預設引數不能同時在函式的宣告和函式定義中出現,二者只能選其一。

3. 預設值必須是常量或全域性變數。

4. 預設引數必須通過值參或常參傳遞。

5.指標和引用

c語言中函式有兩種傳參的方式:傳值和傳址。

以傳值方式,在函式呼叫過程中會生成乙份臨時變數用形參代替,最終把實參的值傳遞給新分配的臨時變數即形參。它的優點是避免了函式呼叫的***,確無法改變形參的值。如果要改變實參的值,只能通過指標傳遞。

void swap (int

*_pleft , int * _pright)

指標可以解決問題,但不是很形象友好,不安全,因此c++中引入了一種新的符合型別–引用。

引用概念

引用不是新定義乙個變數,而是給已存在變數取了乙個別名,編譯器不會為引用變數開闢記憶體空間,它和它引用的變數共用同一塊記憶體空間。

定義的格式為:

型別 &引用變數名 = 已定義過的變數名;

【引用特性】

1. 引用在定義時必須初始化。

2. 乙個變數可以有多個引用。

3. 引用一旦繫結了乙個實體,就不能再改變為其他變數的引用。

void test()

使用場景

【函式形參】

void swap(int &_ileft, int &_iright)

【返回值】

// 值返回

int add(int _ileft, int _iright)

// 引用返回

int& add(int & _ileft, int& _iright)

引用與指標的區別

【相同點】

底層的實現方式相同,都是按照指標的方式來實現的

【不同點】

void test()

總結:

1、引用在定義時必須初始化,指標沒有要求。

2、一旦乙個引用被初始化為指向乙個物件,就不能再指向

其他物件,而指標可以在任何時候指向任何乙個同型別物件

3、沒有null引用,但有null指標。

4、在sizeof中含義不同:引用結果為引用型別的大小,

但指標始終是位址空間所佔位元組個數。

5、引用自加改變變數的內容,指標自加改變了指標指向

6、有多級指標,但是沒有多級引用

7、引用比指標使用起來相對更安全

c 基礎知識篇 初識c

我已經進行了小半年的c 程式設計工作了,先將之前看的參考書的知識進行簡單梳理來增強對c 的理解。梳理將按照參考書的順序,以小知識點的形式進行,c 初學跟著學習會事半功倍。1 c 程式必須且只能包含乙個main函式,main函式的返回值用來指示程式執行的狀態。2 c 原始檔的字尾型別 cc cpp c...

C 基礎知識篇 C 數字

通常,當我們需要用到數字時,我們會使用原始的資料型別,如 int short long float 和 double 等等。這些用於數字的資料型別,其可能的值和數值範圍,我們已經在 c 資料型別一章中討論過。我們已經在之前章節的各種例項中定義過數字。下面是乙個 c 中定義各種型別數字的綜合例項 in...

C 基礎知識篇 C 陣列

c 支援陣列資料結構,它可以儲存乙個固定大小的相同型別元素的順序集合。陣列是用來儲存一系列資料,但它往往被認為是一系列相同型別的變數。陣列的宣告並不是宣告乙個個單獨的變數,比如 number0 number1 number99,而是宣告乙個陣列變數,比如 numbers,然後使用 numbers 0...