【C++基础】常见面试问题(二)
1. 指針和引用的區(qū)別
- 指針保存的是所指對象的地址,引用是所指對象的別名,指針需要通過解引用間接訪問,而引用是直接訪問
- 指針可以改變地址,從而改變所指的對象,而引用必須從一而終;
- 引用在定義的時(shí)候必須初始化,而指針則不需要;
- 指針可以為空,引用不能為空
- 可以有const指針,沒有const引用
?
2. 頭文件中的 ifndef/define/endif 是干什么用的? 該用法和 program once 的區(qū)別?
相同點(diǎn):
- 它們的作用是防止頭文件被重復(fù)包含。
不同點(diǎn)
- ifndef 由語言本身提供支持,但是 program once一般由編譯器提供支持,也就是說,有可能出現(xiàn)編譯器不支持的情況(主要是比較老的編譯器)。
- 通常運(yùn)行速度上 ifndef 一般慢于 program once,特別是在大型項(xiàng)目上, 區(qū)別會比較明顯,所以越來越多的編譯器開始支持 program once。
- ifndef 作用于某一段被包含(define 和 endif 之間)的代碼, 而 program once 則是針對包含該語句的文件, 這也是為什么 program once 速度更快的原因。
- 如果用 ifndef 包含某一段宏定義,當(dāng)這個(gè)宏名字出現(xiàn)“撞車”時(shí),可能會出現(xiàn)這個(gè)宏在程序中提示宏未定義的情況(在編寫大型程序時(shí)特性需要注意,因?yàn)橛泻芏喑绦騿T在同時(shí)寫代碼)。相反由于program once 針對整個(gè)文件, 因此它不存在宏名字“撞車”的情況, 但是如果某個(gè)頭文件被多次拷貝,program once 無法保證不被多次包含,因?yàn)閜rogram once 是從物理上判斷是不是同一個(gè)頭文件,而不是從內(nèi)容上。
?
?
3 當(dāng)i是一個(gè)整數(shù)的時(shí)候++i和i++那個(gè)更快一點(diǎn)?i++和++i的區(qū)別是什么?
答:理論上++i更快,實(shí)際與編譯器優(yōu)化有關(guān),通常幾乎無差別。
i++和++i的考點(diǎn)比較多,簡單來說,就是i++返回的是i的值,而++i返回的是i+1的值。也就是++i是一個(gè)確定的值,是一個(gè)可修改的左值,如下使用:
cout << ++(++(++i)) << endl; cout << ++ ++i << endl;這里有很多的經(jīng)典筆試題,一起來觀摩下:
#include <iostream> using namespace std;int main() {int i = 1;printf("%d,%d\n", ++i, ++i); //3,3printf("%d,%d\n", ++i, i++); //5,3printf("%d,%d\n", i++, i++); //6,5printf("%d,%d\n", i++, ++i); //8,9return 0; }輸出結(jié)果:
分析:
- 首先是函數(shù)的參數(shù)入棧順序從右向左入棧的,計(jì)算順序也是從右往左計(jì)算的,不過都是計(jì)算完以后再進(jìn)行的壓棧操作:
- 對于第1個(gè)printf,首先執(zhí)行++i,返回值是i,這時(shí)i的值是2,再次執(zhí)行++i,返回值是i,得到i=3,將i壓入棧中,此時(shí)i為3,也就是壓入3,3;
- 對于第2個(gè)printf,首先執(zhí)行i++,返回值是原來的i,也就是3,再執(zhí)行++i,返回值是i,依次將3,5壓入棧中得到輸出結(jié)果
- 對于第3個(gè)printf,首先執(zhí)行i++,返回值是5,再執(zhí)行i++返回值是6,依次將5,6壓入棧中得到輸出結(jié)果
- 對于第4個(gè)printf,首先執(zhí)行++i,返回i,此時(shí)i為8,再執(zhí)行i++,返回值是8,此時(shí)i為9,依次將i,8也就是9,8壓入棧中,得到輸出結(jié)果。
上面的分析也是基于VS搞的,不過準(zhǔn)確來說函數(shù)多個(gè)參數(shù)的計(jì)算順序是未定義的(the order of evaluation of function arguments are undefined)。筆試題目的運(yùn)行結(jié)果隨不同的編譯器而異
?
4.?
- ## 引用是否占用內(nèi)存空間? ##(自娛自樂,僅供參考?
2. 引用占用內(nèi)存空間嗎?
如下代碼中對引用取地址,其實(shí)是取的引用所對應(yīng)的內(nèi)存空間的地址。這個(gè)現(xiàn)象讓人覺得引用好像并非一個(gè)實(shí)體。但是引用是占用內(nèi)存空間的,而且其占用的內(nèi)存和指針一樣,因?yàn)橐玫膬?nèi)部實(shí)現(xiàn)就是通過指針來完成的。
?
參考資料
1.?C/C++常見面試知識點(diǎn)總結(jié)附面試真題----20190407更新
總結(jié)
以上是生活随笔為你收集整理的【C++基础】常见面试问题(二)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 成都欢乐谷淡季是什么时候
- 下一篇: 奠基者剧情介绍