1. 程式人生 > >c++ 面試一

c++ 面試一

1、  下面的程式是否有錯誤,如果有錯,請說明原因。 
char* const pszHelp = “hello”; 
pszHelp[0] = ‘a’; 
 
因為 pszHelp 指向一個常量字串,所以根本不允許修改字串內容。除
非使用一個字元陣列。

//armbbs註解:這個題目的答案錯了,此處是正確的
 
2、  const 用法: 
const char* p 
    p 是一字串指標,該指標指向的內容是常量,指標指向的內容不
能被修改 
char const* p 
    同上 char* const p 
    p 是一字串指標,該指標是常量指標,指標不能被修改 
 
3、  什麼是抽象類 
包含抽象函式的類是抽象類,滿足 virtual fun() = 0; 的語法的函式是
抽象函式。主要用於提供介面,如同 Java 中的 Interface。 
 
4、  什麼時候需要使用虛擬解構函式 
一般情況下類的解構函式都定義成虛擬函式,主要是考慮在使用基類指標操
作派生類物件時保證類的析構順序。 
 
5、  請指出下面程式碼存在的潛在問題 
class CC { 
  int* m_pCount; 
public: 
  void clear() { if ( m_pCount ) delete m_pCount; } 
  CC() { m_pCount = new int; } 
  ~CC() { clear(); } 

 
主要存在的問題是 clear 函式在 delete m_pCount;後並沒有置指標為空
(m_pCount = NULL),這樣當第二次呼叫 clear 時,會出現問題。 
 
6、  如何定義禁止例項化的純抽象基類 
這個問題很奇怪,抽象類本身就不能被例項化,在程式編譯時就會提示出錯。  
 
7、  在進行私有繼承時,如何修改基類成員的存取許可權 
定義一個指向該基類的友元函式,就可以繞過私有繼承操作基類成員。 
 
8、  如何定義一個指向類的成員函式的指標 
void (CC::*bfpClear)() = &CC::clear; 
 
9、  類 A 派生類 B 和 C,類 D 從類 B、C 派生,如何將一個類 A 的指標指向
一個類 D 的指標 
直接使用即可,主要是考察執行時多型的概念。本題和題 4 要一起考慮。 
 
 
10、  請說出程式執行的結果 class A { 
public: 
  virtual void func() { cout << “I am in base” << endl; }; 

class B : public A { 
    public: 
  virtual void func() { cout << “I am in derived” << endl; } 

void main()  

  B* bb = new B; 
  bb->func(); 
  A* aa = (A*)bb; 
  aa->func(); 
  …. 

  I am in derived 
  I am in derived 
  主要考察虛擬函式的使用 
 
11、  分析下面程式碼,指出問題 
int* func() { int i =0 ;  return &i; } 
  返回的是一個區域性簡單型別變數地址,程式可能會出錯,而且返回的指標
不能採用 delete 進行刪除。 
class CObject; 
CObject* funobj() { CObject obj; …. return &obj; } 
  返回的是一個區域性 CObject 型別變數地址,程式會出錯,而且返回的指標
不能採用 delete 進行刪除。 
CString funobj() { CString strTemp = _T(“temp”); return strTemp; } 
  不會出錯,返回的 CString 會呼叫 CString的拷貝建構函式返回。 
 
12、  Debug 版本中經常使用 ASSERT 進行斷言,在 Release 版本中有一個起
同樣作用的函式,請說明。 
VERIFY,而且要注意 ASSERT 中的語句在 Release 版本中會忽略。 
 
13、  下面的程式是否有錯誤,如果有錯,請說明原因。 
struct A1 { int i; }; 
A1 a1; 
a1.i = 0; 
    沒有錯誤 
class A1 { int i;}; 
A1 a1; 
a1.i = 0; 
有錯誤,未顯示許可權定義符預設為 private。  
14、  下面程式是否有錯,有錯,請說明原因。 : 
char szTest[] = “hello”; 
char* const psz = szTest; 
psz[0] = ‘b’; 
    沒有錯誤,psz 指向的字串指標是常量,指標不能被修改,但指
針指向的內容可以修改 
 
15、  在繼承層次上,建構函式和解構函式的呼叫順序如何? 
建構函式:先基類,後派生類 
解構函式:先派生類,後基類 
 
16、  如果一個包容器中包含指向物件的指標,當從包容器中刪除某個指標
時,會析構該指標指向的物件嗎? 
包容器並不關心存放物件的型別,所以從包容器中刪除成員時,僅僅只是
從容器中釋放該成員佔有的空間。如果該成員是一個指向某個物件的指標,由
使用者保證指標指向物件的記憶體釋放。 
 
17、  如何阻止建構函式的自動轉換 
首先要理解什麼是建構函式的自動轉換。 
比如有  
class A {….}; 
class B { B(A&) {…};}; 
func(B) {}; 
main()  

  A a; 
  Func(a); 

在呼叫 Func(a)時,會自動呼叫 B(A&)建構函式,保證傳給 Func 的引數是
B 型別。應該採用 explicit 關鍵字來防止建構函式的自動轉換。 
 
18、  類的成員函式作為回撥函式有什麼要求? 
必須是靜態成員函式。 
 
19、  分析程式碼,給出 i, j ,k 的結果。 
int i = 0, j = 0; k = 0; 
if (++i || j++ || ++k ) {} 
  主要是注意前置操作符和後置操作符的區別,還要考慮 或操作 在條件判
斷中的實現(如果一個為真,則不進行後續判斷) 。 
  i = 1, j = 0, k = 0