c++面試題中經常被面試官面試的小問題總結(一)(本篇偏向基礎知識)


 

 

原文作者:aircraft

原文鏈接:https://www.cnblogs.com/DOMLX/p/10711810.html

 

 

一套面試題的目錄在此,還在繼續完善中。。。。。。

c/c++ 2019面試題目錄

 

 

 

1.類中的函數定義后加了一個const代表什么?

 

代表它將具備以下三個性質:

  1.const對象只能調用const成員函數。
   2.const對象的值不能被修改,在const成員函數中修改const對象數據成員的值是語法錯誤
  3.在const函數中調用非const成員函數是語法錯誤


  任何不會修改數據成員的函數都應該聲明為const類型。
  如果在編寫const成員函數時,不慎修改了數據成員,
 或者調用了其它非const成員函數,編譯器將指出錯誤,這無疑會提高程序的健壯性。
 所以看完上面這句話就應該明白了函數定義后加const的用處,以及什么時候用到const,這會是一個好的編程習慣的。
以下程序中,類stack的成員函數GetCount僅用於計數,從邏輯上講GetCount應當為const函數。編譯器將指出GetCount函數中的錯誤。 class Stack { public: void Push(int elem); int Pop(void); int GetCount(void) const; // const成員函數 private: int m_num; int m_data[10]; }; int Stack::GetCount(void) const { ++ m_num; // 編譯錯誤,企圖修改數據成員m_num Pop(); // 編譯錯誤,企圖調用非const函數 return m_num; }

 

 2.#include<>與#include""的區別?

 

<>表明這是一個工程或者標准頭文件。查找過程會首先檢查預定義的目錄,我們可以通過 設置搜索路徑環境變量或者命令行選項來修改這些目錄、 “”表明該文件是用戶自定義的頭文件,查找時應從當前目錄或者指定目錄查找。 總結:自己的定義的頭文件用雙引號導入,像庫文件之類的標准頭文件用<>導入

 

 

3.c++中的雙冒號::

1、表示“域操作符” 例:聲明了一個類A,類A里聲明了一個成員函數void f(),但沒有在類的聲明里給出f的定義,那么在類外定義f時, 就要寫成void A::f(),表示這個f()函數是類A的成員函數。 2、直接用在全局函數前,表示是全局函數 例:在VC里,你可以在調用API 函數里,在API函數名前加:: 3、表示引用成員函數及變量,作用域成員運算符 4、變量前面的雙冒號::,代表引用全局變量,比如我在全局定義了一個全局變量 int value = 1; 局部函數內又定義了一個 int value = 2; 而在這個局部函數中我想給全局那個變量賦值就這樣 ::value = 250;

 

4.宏參數的連接,#和##符號的作用。

某面試題:求下面輸出結果 一般用法 我們使用#把宏參數變為一個字符串,用##把兩個宏參數貼合在一起. #define STR(s) #s #define CONS(a,b) int(a##e##b) printf(STR(vck)); // 輸出字符串"vck" printf("%d\n", CONS(2,3)); // 2e3 輸出:2000 

 

5.static定義的函數如何在其他文件調用?(不能在其他文件直接調用!!!)

1. 通過函數指針的方式, 我們只要得到這個函數的地址,那么就一定可以調用它,
大家要知道static函數是對編譯器起作用的,在運行時根本沒有static了,有的只是函數地址,
所以只要搞到函數地址管它是不是static的,照調不誤,
2. 通過非static函數的方式,我們可以定義一個普通的函數,
讓這個普通函數調用static函數,讓后在把這個普通函數在頭文件中聲明 舉例:利用可在本文件調用的屬性,另加一個函數fun,fun調用該static函數;其他文件調用fun即可。 另外,要強調,extern不能作用在static函數

 

6.sizeof計算變量空間容易出錯的地方?

某面試題: char str[] = "hello"; sizeof(str)=_?_ void Func(char str[100]) { sizeof(str)=_?_ } 第一個答案是6,因為對數組變量進行sizeof運算的時候得到的是數組占用內存。 第二個答案是4,在函數中形參的作用是傳址,本質是一個指針,指向了一個str[100]。 某面試題: class A { public: char c1; int i; char c2; }; int main() { printf("%d",sizeof(A)); return 0; }
問輸出是多少?
  很多人都是直接相加求值,但是sizeof對類以及結構體作用時會有一個字節對齊機制,
對齊機制的對齊方式為其最大成員對齊方式,會將定義變量的內存補全,方便系統運算。
c1的偏移量為0,i的偏移量為4,c1與i之間便需要3個字節填充。
c2的偏移量為8,那么結果就是1+3+4+1=9,由於這里最寬的字節
為int,4個字節。補全之后答案為12. 這里吧Int換成double的話答案就是24

也可以自己手動是設置對齊方式,只要在程序的開頭部分 加上一句 #pragma pack(x)

 

 

7.內聯函數與宏的區別?

1、內聯函數在編譯時展開,宏在預編譯時展開。 2、在編譯的時候,內聯函數可以被鑲嵌到代碼中,而宏只是一個簡單的文本替換。 3、宏不是函數,inline是函數。 4、宏在定義的時候容易因為二義性出錯,而內聯函數不會。

 8.內聯函數比宏優勢在什么地方?

 

 

 

9.為什么不把所有函數都定義成內聯函數呢?

 

10.下面輸出為多少?(某年微軟面試題)

int func(x) {   int countx = 0;   while(x)    {     countx ++;     x = x&(x-1);    }   return countx; } 假定x = 9999。 答案:8 思路:將x轉化為2進制,看含有的1的個數。

 

本篇是第一篇面試題總結,后面還有好多篇,想要劍指offer的關注我把!!!

 

 

若有興趣交流分享技術,可關注本人公眾號,里面會不定期的分享各種編程教程,和共享源碼,諸如研究分享關於c/c++,python,前端,后端,opencv,halcon,opengl,機器學習深度學習之類有關於基礎編程,圖像處理和機器視覺開發的知識

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM