c++面試
Bjarne Stroustrup 的 C++ 風格與技術 FAQ(中文版)
1、盡可能說出static關鍵字的作用?
(1) static修飾函數局部變量(包括main函數裏的),該變量不會隨著函數作用域的退出而銷毀,而是只分配一次內存,下次調用時為上次調用的值。
(2) static修飾全局變量,限定了該變量只能被本文件訪問,不能被其他文件訪問。
(3) static修飾的函數只能被本文件訪問,不能被其他文件訪問。
(4) static menber屬於類,所有該類的實例對象共享一份拷貝(此處是名詞)
(5) static menber function不接受this指針,只能訪問靜態成員
由此衍生出問題:靜態變量和靜態成員函數的用法?
2、盡可能說出const的用法?
const不能簡單的只認為是 “常數”,c語言中要使用常數,比如PI,會用define,<<effective c++>>推薦使用const,因為使用宏如果編譯報錯,是不會顯示PI的,只提示3.1415數字。const的真正用意是為了提醒程序員,該對象是不可修改的。
(1) 用const修飾一個變量,需要初始化,忘記初始化會編譯報錯
(2) const與指針作用時,<<c++ primer 5th>> 分為pointer to const(指向常量的指針,指針自以為指向的是常量,不能用指針來修改對象,而不要求該對象是 const的),const pointer(指針不能指向其他對象),或者const int * const p =&a;
(3) const 修飾形參,表明不能通過形參修改實參,可以接收const對象作為實參或non-const對象
(4) const引用,不能用引用去修改所引對象,但對象本身可以是可修改的, 引用本身不能再指向其他對象
(5) const修飾成員函數,則該函數不能修改成員變量,但是如果變量是指針,用指針可以修改所指的資源(見effctive c++ item 03);const men fun是可以 重載的,如const T &operator[]() const 、T&operator[]();前者可以被const T類型的對象調用,後者不能,因為const對象會把this指針轉換為const 指針
(6) const修飾函數範圍類型,這樣就不會有a*b=c(假設重載了*)這樣詭異的合法代碼。
1 const classA operator*(const classA& a1,const classA& a2); 2 operator*的返回結果必須是一個const對象。如果不是,這樣的變態代碼也不會編譯出錯: 3 classA a, b, c; 4 (a * b) = c; // 對a*b的結果賦值
(7) const 與define的優點
ps:const mem fun隱含有一個const *this參數,static mem fun隱含沒有this指針,所以兩者一起修飾成員函數是不能通過編譯的
3、引用與指針的區別?為什麽不用string *const p 代替string &p
首先說明為什麽引入引用?
因為加入引用是為了支持operator overloading。這裏有一個假設,如果沒有引用,那麽,用指針來operator overloading操作。A operator +(const A *a, const A *_a); 那麽使用的時候,&a + &b,這樣看起來是不是很難受。使用指針可讀性差,*p。
而引入引用的概念,既可以滿足overload operator,也不失重載value和pointer的靈活性。而且引用還帶來一個指針無法替代的特性: 引用臨時對象。因為引用必須在定義的時候就賦值,以後無法更改。string &s=string();
(1) 引用必須被初始化,沒有void 引用,編譯時引用必須與某個對象bind,引用不是對象,只是別名,引用本身不分配內存。
(2) 不能有string & const s,可以有const string&s ,後者為常量引用。
(3) 解引用操作是對指針,獲取指針所指對象,不是對引用操作
(4) sizeof(引用)得到bind對象的大小,sizeof(pointer)得到指針本身的大小
(5) 作為函數形參,如果實參是指針,用實參初始化形參,是傳址(本質上也是傳值)——>可能需要指針類型轉換,或派生類指針傳給基類指針;如果是傳引用,傳遞的是對象本 身,不需要要額外的復制開銷。如果需要修改指針,可以用二級指針
4、將“引用”作為函數參數有哪些特點?
(1) 傳遞引用給函數與傳遞指針的效果是一樣的。這時,被調函數的形參就成為原來主調函數中的實參變量或對象的一個別名來使用,所以在被調函數中對形參變量的操作就是對相應 的目標對象(在主調函數)的操作。
(2) 使用引用傳遞函數的參數,在內存中並沒有產生實參的副本,它是直接對實參操作;而使用一般變量傳遞函數的參數,當發生函數調用時,需要給形參分配存儲單元,形參變量是 實參變量的副本;如果傳遞的是對象,還將調用拷貝構造函數。因此,當參數傳遞的數據較大時,用引用比用一般變量傳遞參數的效率和所占空間都好。
(3) 使用指針作為函數的參數雖然也能達到與使用引用的效果,但是,在被調函數中同樣要給形參分配存儲單元,且需要重復使用"*指針變量名"的形式進行運算,這很容易產生錯誤且 程序的閱讀性較差;另一方面,在主調函數的調用點處,必須用變量的地址作為實參。而引用更容易使用,更清晰。
看了一些C++面經,有基礎問題如const的幾種作用、虛函數的實現機制、熟悉shared_ptr嗎、這些是C++的語言特性部分,如果要考察STL,我目前只直到vector、list,對各種算法其他容器不熟悉,更不用說容器的時間效率與空間開銷;如果要考察算法,鏈表和二叉樹、快速排序、堆排序,這又可以結合make_head() 等堆函數;如果是要考察代碼實現,如memcpy、strstr、strcmp等。所以我需要牢固掌握C++的基礎知識,STL,再就是刷題,掌握各種常考的算法,這些才是我能達到的優勢項,linux、項目等不是我短期能擅長的地方。
c++面試