日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

【C++基础】常见面试问题(二)

發(fā)布時間:2023/11/30 c/c++ 64 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【C++基础】常见面试问题(二) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

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++實現(xiàn)代碼為: int operator++(int) {int temp = *this;++*this;return temp; }//返回一個int型的對象本身// ++i實現(xiàn)代碼為: int& operator++() {*this += 1;return *this; }//返回一個int型的對象引用

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)就是通過指針來完成的。

// 比如 Type& name; <===> Type* const name。 int main(void) {int a = 8;const int& b = a;int* p = &a;*p = 0;cout << a; //output 0return 0; }

?

參考資料

1.?C/C++常見面試知識點總結(jié)附面試真題----20190407更新

總結(jié)

以上是生活随笔為你收集整理的【C++基础】常见面试问题(二)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。