內聯函式
在c++98
的標準下為63
個關鍵字
//1. 普通的命名空間
namespace n1 // n1為命名空間的名稱
}//2. 命名空間可以巢狀
namespace n2
namespace n3 }
}//3. 同乙個工程中允許存在多個相同名稱的命名空間,編譯器最後會合成同乙個命名空間中。
1.加命名空間名稱及作用域限定符
int main()
2.使用using將命名空間中成員引入
using n1::b;
int main()
3.使用using namespace 命名空間名稱引入
using namespace n1;
int main()
#includeusing namespace std;
int main()
double add(double left, double right)
long add(long left, long right)
int main()
注意
c函式不支援函式過載?
原因在於:名字修飾
名字修飾(name mangling)是一種在編譯過程中,將函式、變數的名稱重新改編的機制,簡單來說就是編譯器為了區分各個函式,將函式通過一定演算法,重新修飾為乙個全域性唯一的名稱。
為什麼c語言不支援函式過載?
引用不是新定義乙個變數,而是給已存在變數取了乙個別名,編譯器不會為引用變數開闢記憶體空間,它和它引用的變數共用同一塊記憶體空間。
型別& 引用變數名(物件名) = 引用實體;
void testref()
注意:引用型別必須和引用實體是同種型別的
注意
引用在定義時必須初始化
乙個變數可以有多個引用
引用一旦引用乙個實體,再不能引用其他實體
常引用
void testconstref()
陣列的引用
void printarray(int (&array)[10]) //int (&array) [10]
//單純引入值
void swap2(int left, int right)
//單純引入指標
void swap3(int *left, int *right)
int main()
上述三種傳值方式對比:
注意
引用 <=> 指標
int& ra = a; <=> int * const ra = &a;//const代表ra只能指向a
2. 作返回值(生命週期比函式長)
看下面兩個**的比較:
int add(int a, int b)
int main()
int& add(int a, int b)
int main()
引用和指標的區別
引用在定義時必須初始化,指標沒有要求
引用在初始化時引用乙個實體後,就不能再引用其他實體,而指標可以在任何時候指向任何乙個同型別實體
沒有null引用,但有null指標
++的含義不同:引用自加即引用的實體增加1,指標自加即指標向後偏移乙個型別的大小
有多級指標,但是沒有多級引用
訪問實體方式不同,指標需要顯式解引用,引用編譯器自己處理
引用比指標使用起來相對更安全
以inline修飾的函式叫做內聯函式,編譯時c++編譯器會在呼叫內聯函式的地方展開,沒有函式壓棧的開銷,內聯函式提公升程式執行的效率。
在介紹內聯函式時,先引入一下巨集
巨集巨集的優缺點?
#define max(a, b) ((a) > (b) ? a : (b)) //這就是乙個巨集
int main()
上面的** a 有時候自增1次 ,有時候又自增兩次(與其比較的數字的大小來決定的),這樣的**是不好的,怎麼處理?—>內聯函式
inline int max(int a, int b)
int main()
原因:
這種轉移操作要求在轉去前要保護現場並記憶執行的位址,轉回後先要恢復現場,並按原來儲存位址繼續執行。因此,函式呼叫要有一定的時間和空間方面的開銷,於是將影響其效率。
特性inline是一種以空間換時間的做法,省去呼叫函式額開銷。所以**很長或者有迴圈/遞迴的函式不適宜使用作為內聯函式。
inline對於編譯器而言只是乙個建議,編譯器會自動優化,如果定義為inline的函式體內有迴圈/遞迴等等,編譯器優化時會忽略掉內聯。
補充常見面試題:
巨集的優缺點與那些技術可以可以替代巨集?
巨集的優點:
1.增強**的復用性。
2.提高效能
缺點:1.不方便除錯巨集。(因為預編譯階段
進行了替換)
2.導致**可讀性差,可維護性差,容易誤用。
3.沒有型別安全的檢查
c++有哪些技術替代巨集?
常量定義 換用 const
函式定義 換用 內聯函式
型別重定義 換用 typedef
c 基本知識
1.類 包含某一物體的基本屬性的抽象。2.物件 具體指某乙個物體。實實在在存在的東西。3.建構函式 負責類建立物件的函式。如果類沒有宣告建構函式,c 編譯器會提供預設的無參的建構函式。這個函式只負責建立物件,不負責物件初始化工作。4.析構函式 負責釋放物件,記憶體的 5.變數訪問修飾符 public...
c 基本知識
函式過載 c語言的符號生成規則 只和函式名有關 c 的符號生成規則 函式原型 函式頭部 1.返回值 返回值不能作為過載的依據,可能會產生二義性 2.函式名 c語言的符號生成規則只和函式名有關,如果把函式名作為返回值的話,就和c語言衝突了.3.函式形參 1 引數個數 2 引數型別 3 引數順序 函式形...
C 基本知識
c 基本語法 特點 1每條語句以分號結尾,建議一行一語句 2嚴格區分大小寫 3 塊使用來界定,塊種可包含任意條語句 注釋 單行注釋 多行注釋 摺疊 region.endregion 變數 計算機種佔據一定記憶體單元的儲存區域。變數名 儲存資料的變數所佔據的那塊記憶體單元的標識名。變數的命名規則及特點...