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