一些簡單的c 入門知識

2021-09-28 20:33:08 字數 4224 閱讀 3359

1 命名空間

在c/c++中,變數、函式和類都是大量存在的,這些變數、函式和類的名稱將都存在於全域性作用域中,可能會導致很多衝突。使用命名空間的目的是對識別符號的名稱進行本地化,以避免命名衝突或名字汙染,namespace關鍵字的出現就是針對這種問題的。即命名空間可以限定識別符號名稱的作用域,有時如果識別符號名稱相同,但只要合理利用namespace就可以限定該變數或函式或類名的作用域,這樣就不會引起衝突,從而增加了函式的安全性。

所以乙個命名空間就定義了乙個新的作用域,命名空間中的所有內容都侷限於該命名空間中。

1 命名空間的定義

//1. 普通的命名空間 

namespace n1 // n1為命名空間的名稱

}//2. 命名空間可以巢狀

namespace n2

namespace n3 }}

//3. 同乙個工程中允許存在多個相同名稱的命名空間

// 編譯器會合成在同乙個命名空間中。

namespace n1

}

命名空間的使用

以該例為準

namespace n 

intsub

(int left,

int right)

}

命名空間的使用分為三種,如下

1 加命名空間名稱及作用域限定符

int

main()

2 使用using引入命名空間成員

using n::b;

intmain()

3 使用using namespace將命名空間名稱引入

//注意:該方式一般不推薦使用,它將命名空間中的成員名全域性化,類似於全域性變數

//這在一定程度上違背了命名空間設計的初衷

//這裡為了方便我用了using namespace

using

namespace n;

intmain()

2 c++的輸入&輸出

cout標準輸出,cin標準輸入

使用cout標準輸出(控制台)和cin標準輸入(鍵盤)時,必須包含< iostream >標頭檔案以及std標準命名空間。(早期標準庫將所有功能在全域性域中實現,宣告在.h字尾的標頭檔案中,使用時只需包含對應標頭檔案即可,後來將其實現在std命名空間下,為了和c標頭檔案區分,也為了正確使用命名空間,規定c++標頭檔案不帶.h;舊編譯器(vc 6.0)中還支援格式,後續編譯器已不支援,因此推薦使用 +std的方式。)

輸出

using

namespace n;

using

namespace std;

intmain()

輸入(從鍵盤)

using

namespace std;

intmain()

通過以上兩例子可以看出,它比c中的輸入輸出使用更加方便(輸入輸出時不用加資料格式控制%d,%c等等),功能更加強大(可以連續輸出輸入);

3 預設引數

概念:預設引數是宣告或定義函式時為函式的引數指定乙個預設值。在呼叫該函式時,如果沒有指定實參則採用該 預設值,否則使用指定的實參。

namespace n 

//下列注釋掉的三行,編譯不會通過

//因為預設引數規定:半預設引數必須從右往左依次來給出,不能間隔著給

//int add(int left = 10, int right)

//全預設引數

intsub

(int left=10,

int right=10)

}int

main()

預設引數使用注意:

半預設引數必須從右往左依次來給出,不能間隔著給

預設引數不能在函式宣告和定義中同時出現

預設值必須是常量或者全域性變數

c語言不支援(編譯器不支援)

4 函式過載

概念:是函式的一種特殊情況,c++允許在同一作用域中宣告幾個功能類似的同名函式,這些同名函式的形參列表(引數個數 或 型別 或 順序)必須不同,常用來處理實現功能類似資料型別不同的問題

//例如如下四個函式雖然函式名相同,但是卻是不同的函式

intadd

(int left,

int right)

//型別不同

double

add(

double left,

double right)

//個數不同

intadd

(int left,

int middle,

int right)

//順序不同

intadd

(int right,

int left)

c++支援函式過載的原因:

c++支援函式過載的原因是因為c++中名字修飾(name mangling)規則的原因

在c/c++中,乙個程式要執行起來,需要經歷以下幾個階段:預處理、編譯、彙編、鏈結。name mangling是一種在編譯過程中,將函式、變數的名稱重新改編的機制,簡單來說就是編譯器為了區分各個函式,將函式通過某種演算法,重新修飾為乙個全域性唯一的名稱。

c語言的名字修飾規則非常簡單,只是在函式名字前面新增了下劃線,所以不支援函式過載。

而c++中名字修飾的規則更為複雜(其可能包含引數的名稱,引數的型別,引數的作用域等等,各編譯器修飾規則不同),所以函式名相同,卻可以是不同的函式,所以c++支援函式過載

5引用

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

注意:引用在定義時必須初始化

乙個變數可以有多個引用

引用一旦引用乙個實體,再不能引用其他實體

引用型別必須和引用實體是同種型別的

namespace n 

intsub

(int left=10,

int right=10)

}using

namespace std;

intmain()

void

testref()

常引用

void

testconstref()

引用作為引數

不會發生拷貝,是對被傳參物件的本省的操作

void

swap

(int

& left,

int& right)

做返回值

int

&testrefreturn

(int

& a)

/*注意(:如果函式返回時,離開函式作用域後,其棧上空間已經還給系統,因此不能

用棧上的空間作為引用型別返回。如果以引用型別返回,返回值的生命週期必須不受

函式的限制(即比函式生命週期長)。

)*/

引用和指標的區別

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

引用在初始化時引用乙個實體後,就不能再引用其他實體,而指標可以在任何時候指向任何乙個同型別實體

沒有null引用,但有null指標

引用自加即引用的實體增加1,指標自加即指標向後偏移乙個型別的大小

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

訪問實體方式不同,指標需要顯式解引用,引用編譯器自己處理

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

6 內聯函式

概念:以inline修飾的函式叫做內聯函式,編譯時c++編譯器會在呼叫內聯函式的地方展開,沒有函式壓棧的開銷, 內聯函式提公升程式執行的效率。

特點:1.inline是一種以空間換時間的做法,省去呼叫函式額開銷。所以**很長或者有迴圈/遞迴的函式不適宜 使用作為內聯函式。

inline對於編譯器而言只是乙個建議,編譯器會自動優化,如果定義為inline的函式體內有迴圈/遞迴等 等,編譯器優化時會忽略掉內聯。

c 的一些入門

cout 物件名 cin radius 輸入乙個初始的值 浮點數在程式中是近似儲存的,所以要比較兩個浮點數的大小。需求差是否足夠小。逗號運算子 格式 表示式1,表示式2 求解順序 先求表示式1,在求表示式2.最終結果為表示式2的值 列如 a 3 5 a 4 最終的結果為60 邏輯運算子 非 與 或 ...

c 的一些入門

cout 物件名 cin radius 輸入乙個初始的值 浮點數在程式中是近似儲存的,所以要比較兩個浮點數的大小。需求差是否足夠小。逗號運算子 格式 表示式1,表示式2 求解順序 先求表示式1,在求表示式2.最終結果為表示式2的值 列如 a 3 5 a 4 最終的結果為60 邏輯運算子 非 與 或 ...

C 的一些知識

1.c 中非虛函式都是靜態繫結,虛函式是動態繫結。指標或引用訪問物件的虛函式時才能進行動態繫結。靜態多型性 編譯時確定操作的物件。如 函式過載,運算子過載。動態多型性 執行時確定操作的物件。繫結 函式實現與函式名進行繫結。2.有虛函式的類,虛表存放虛函式的位址。3.例項化空類,所佔記憶體的大小為1....