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