天天看點

C++基礎

const

7.C++編譯器對const常量的處理

        (1)當碰見常量聲明時在符号表中放入常量

        (2)編譯過程中若發現使用常量則直接以符号表中的值替換

        (3)編譯過程中若發現對const使用了extern或者&操作符,則給對應的常量配置設定存儲空間

8.C語言中的const變量:是隻讀變量,有自己的存儲空間

9.C++中的const,在定義的時候放入符号表中,在使用的時候直接從符号表中取出,可以通過取位址改變記憶體的值,但是在使用的時候不會用記憶體中的值

10.當const常量為全局,并且需要在其他檔案中使用,當使用&操作符取const常量的位址

11.C++所有的變量和函數都必須有類型

12.在C語言中int f()表示傳回值為int ,接受任意參數的函數

int f(void);表示傳回值為int 的無參函數

在C++中

int f();和int f(void)具有相同的意義,都表示傳回值為int的無參函數

bool

13.C++中的布爾類型

(1)C++在C語言的基本類型系統之上增加了bool

(2)C++的bool可取的值隻有true和false

(3)理論上bool隻占用一個位元組

如果多個bool變量定義在一起,可能會個占一個bit,這取決于編譯器的實作

Tip:

true代表真值,編譯器内部用1來表示

false代表非真值,編譯器内部用0來表示

14.bool類型隻有true和false兩個值

C++編譯器會在指派時将非0值轉換為true,0值轉換為false。

15.bool類型也參加數學運算

16.三目運算符的更新:C語言中傳回的是變量的值,C++中傳回的是變量的本身。三目運算符可能的傳回值中如果有一個是常量值,則不能作為左值使用.

引用

17.C++中的引用:引用可以看作一個已定義變量的别名

引用的文法:Type& name=var;(普通引用在聲明時必須用其他的變量進行初始化)

18.引用的意義:

引用作為其他變量的别名而存在,是以在一些場合可以代替指針

引用相對于指針來說具有更好的可讀性和實用性

19.引用作為函數參數聲明時不進行初始化

20.引用是正宗的傳址,指針實質上是傳值

21.const引用

(1)在C++中可以聲明const引用

(2)const Type& name=var

(3)const引用讓變量擁有隻讀屬相

22.當使用常量對const引用進行初始化時,C++編譯器會為常量值配置設定空間,并将引用名作為這段空間的别名(使用常量對const引用初始化後将生成一個隻讀變量)

23.引用在C++中的内部實作是一個常指針

Type&name=Type* const name

C++編譯器在編譯過程中使用常指針作為引用的内部實作,是以引用所占用的空間大小與指針相同

從使用的角度,引用會讓人誤會其隻是一個别名,沒有自己的存儲空間,隻是C++為了實用性而做出的細節隐藏。

24. 當函數傳回值是引用時:

若傳回棧變量:不能成為其他引用的初始值,不能作為左值使用

若傳回靜态變量或全局變量:可以成為其他引用的初始值,即可作為右值使用,也可作為左值使用

内聯函數

25.C++中推薦使用内聯函數替代宏代碼片段

C++中使用inline關鍵字聲明内聯函數

inline int func(int a,int b)
{
return a<b? a:b;
}      

内聯函數聲明時inline關鍵字必須和函數定義結合在一起,否則編譯器會直接忽略内聯請求

26.

        (1)C++編譯器可以将一個函數進行内聯編譯

        (2)被C++編譯器内聯編譯的函數叫做内聯函數

        (3)内聯函數在最終生成的代碼中是沒有定義的

        (4)C++編譯器直接将函數體插入函數調用的地方

        (5)内聯函數沒有普通函數調用時的額外開銷(壓棧,跳轉,傳回)

C++編譯器不一定準許函數的内聯請求

        (6)内聯函數是一種特殊的函數,具有普通函數的特征(參數檢查,傳回類型等)

        (7)内聯函數是對編譯器的一種請求,是以編譯器可能拒絕這種請求

        (8)内聯函數由編譯器處理,直接将編譯後的函數體插入調用的地方,宏代碼片段由預處理器處理,進行簡單的文本替換,沒有任何編譯過程。

27.現代C++編譯器能夠進行編譯優化,是以一些函數即使沒有inline聲明,也可能被編譯器内聯編譯

28.另外,一些現代C++編譯器提供了拓展文法,能夠對函數進行強制内聯

如:

_attribute_((always_inline))//屬性      

29.C++内聯編譯的限制:

(1)不能存在任何形式的循環語句

(2)不能存在過多的條件判斷語句

(3)函數體不能過于龐大

(4)不能對函數進行取位址操作

(5)函數内聯聲明必須在調用語句之前

編譯器對于内聯函數的限制并不是絕對的,内聯函數相對于普通函數的優勢隻是省去了函數調用時壓棧,跳轉和傳回的開銷,是以,當函數體的執行開銷遠大于壓棧,跳轉和傳回所用的開銷時,那麼内聯将無意義。

30.C++中的符号表編譯器自己所用的東西,不會進入最終的程式的。

31.C++中可以在函數聲明時為參數提供一個預設值,當函數調用時沒有指定這個參數的值,編譯器會自動用預設值代替

32.函數預設參數的規則:

(1)隻有參數清單後面部分的參數才可以提供預設參數值

一旦在一個函數調用中開始使用預設參數值,那麼這個參數後的所有參數都必須使用預設參數值

33.在C++中可以為函數提供占位參數

(1)占位參數隻有參數類型聲明,而沒有參數名聲明

(2)一般情況下,在函數體内部無法使用占位參數

34.可以将占位參數與預設參數結合起來使用

(1)為以後程式的拓展留下線索

(2)相容C語言中可能出現的不規範寫法

35.

重載

定義:同一個辨別符在不同的上下文有不同的意義

36.函數重載:

(1)用同一個函數名定義不同(參數不同)的函數

(2)當函數名和不同的參數搭配時函數的含義不同

37.函數重載至少滿足下面的一個條件:

        (1)參數個數不同

        (2)參數類型不同

        (3)參數順序不同

38.當函數的預設參數和函數重載在一起時:引用會報錯(存在二議性,調用失敗)

39.編譯器調用重載函數的準則:

(1)将所有同名函數作為候選者

(2)嘗試尋找可行的候選函數

.精确比對實參

.通過預設參數能夠比對實參

.通過預設類型轉換比對實參

(3)比對失敗

.最終尋找到的可行候選函數不唯一,則出現二義性,編譯失敗

.無法比對所有候選者,函數未定義,編譯失敗

40.函數重載的注意事項:

(1)重載函數在本質上是互相獨立的不同函數

(2)重載函數的函數類型是不同的

(3)函數傳回值不能作為函數重載的依據

函數重載是由函數名和參數清單決定的

41.

函數重載與函數指針

(1)當使用重載函數名對函數指針進行指派時

.根據重載規則挑選與函數指針參數清單一緻的候選者

.嚴格比對候選者的函數類型與函數指針的函數類型

42.利用extern關鍵字強制讓C++編譯器對代碼進行C方式編譯

43.C++中的動态記憶體配置設定:

.C++中通過new關鍵字進行動态記憶體申請

.C++中的動态記憶體申請是基于類型進行的

.delete關鍵字用于記憶體釋放

44.new關鍵字與malloc函數的差別:

(1)new關鍵字是C++的一部分,malloc是由C庫提供的函數

(2)new以具體類型為機關進行記憶體配置設定,malloc隻能以位元組為機關進行記憶體配置設定

(3)new在申請單個類型變量時可進行初始化,malloc不具備記憶體初始化的特性

int* pi=new int(1);//将指針指向的變量初始化
float* pf=new float(2.0);      

45.在C語言中隻有一個全局作用域:

C語言中所有的全局辨別符共享一個作用域,辨別符之間可能發生沖突

46.C++提出了命名空間的概念

(1)命名空間将全局作用域分成不同的部分

(2)不同命名空間中的辨別符可以同名而不會發生沖突

(3)命名空間可以互相嵌套

(4)全局作用域也叫預設命名空間

47.C++命名空間關鍵字為(namespace)

48.C++命名空間的使用:

        (1)使用整個命名空間:using namespace name;

        (2)使用命名空間中的變量:using nam::variable

        (3)使用預設命名空間中的變量:::variable

預設情況下可以直接使用預設命名空間中的所有辨別符。

49.C++中含有四個關鍵字用于強制類型轉換:

(1)static_cast強制類型轉換

.用于基本類型間的轉換,但不能用于基本類型指針間的轉換

.用于有繼承關系類對象之間的轉換和類指針之間的轉換

------static_cast是編譯期進行轉換的,無法再運作時檢測類型,是以類類型之間的轉換可能存在風險

int i=0;
char c='c';
c=static_cast<char>(i);      

(2)const_cast強制類型轉換

.用于去除變量的const屬性

const int& j=1;
int& k=const_cast<int&>(j);      

(3)reinterpret_cast強制類型轉換

.用于指針類型間的強制轉換

.用于整數和指針類型間的強制轉換

reinterpret_cast直接從二進制進行複制,是一種極其不安全的轉換

(4)dynamic_cast強制類型轉換

.主要用于類型層次間的轉換,還可以用于類之間的交叉轉換

.dynamic_cast具有類型檢查的功能,比static_cast更安全

50.隻有字面量初始化的const常量才會進入符号表

51.被volatile修飾的const常量不會進入符号表

52.const引用的類型與初始化變量的類型

53.指針與引用的差別:

(1)指針是一個變量,其值為一個記憶體位址,通過指針可以通路對應記憶體位址中的值

(2)引用隻是一個變量的新名字,是以對引用的操作(指派,取位址等)都會傳遞到其引用的變量上

(3)指針可以被const修飾成為常量或者隻讀變量

(4)const引用使其引用的變量具有隻讀屬性

(5)指針就是變量,不需要初始化,也可以指向不同的位址

(6)引用天生就必須在定義時初始化,之後無法在引用其他變量

54.C++編譯器對字面量的處理方式:

(1)整數型字面量的預設類型為int,占用4個位元組

(2)浮點型字面量的預設類型為double,占用8個位元組

(3)字元型字面量的預設類型為char,占用1個位元組

(4)字元串型字面量的預設類型為const char*,占用4個位元組

55.當使用字面量對變量進行初始化或指派時:

上一篇: C++基礎
下一篇: C++基礎