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....