原文作者: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,機器學習深度學習之類有關於基礎編程,圖像處理和機器視覺開發的知識