您好,登錄后才能下訂單哦!
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.當使用字面量對變量進行初始化或賦值時:
(1)無溢出產生:編譯器對字面量進行默認類型轉換
(2)產生溢出:編譯器會做截斷操作,并產生警告
56.C編譯器編譯后不會再函數名中加上參數的信息,而C++為了支持重載加上了函數參數的信息。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。