今天去參加了c++考試,題不難,但是看程序寫結果全是和構造函數、析構函數有關的,平時我認爲我在這方面絕對沒有問題的,不就是一個構造函數麼,那有什麼難的,可是當我真正面對試題的時候,我才知道我下筆是那麼的猶豫,這也是許多人面試結果不理想的原因吧----平時忽略了基礎知識的積累,但是公司面試的時候就要看你對基礎知識的掌握程度。話不多說,先看看下面的例子:
#include<iostream>
using namespace std;
class A
{
public:
A() {cout << "A" << endl;}
~A() {cout << "~A" << endl;}
void fn() {cout << "A fn()" << endl;}
};
class B : public A
{
public:
B() {cout << "B" << endl;}
~B() {cout << "~B" << endl;}
void fn() {cout << "B fn()" << endl;}
};
int main()
{
A *pa = new B; //這是重點
pa->fn();
delete pa; //如果沒有這句結果是什麼
return 0;
}
有經驗的人對這道題不會有太大的問題,就是考你對虛函數(包括虛析構函數),但是問題是人家不是有的時候給你少一句或者多一句,你沒有清楚就貿然下筆了,結果你肯定會後悔莫及。就那這個例子來說,首先人家肯定要求你解釋你的結果。還有可能人家會在基類(A)中添加一個成員變量,如 :char *pname; 在main()函數增加 B b2 = b1; 之類的,讓你去補充相應的構造函數或者你認爲需要增添的函數,你能順利寫下來嗎?(你可能要補充的有帶參構造函數,拷貝構造函數,賦值運算符重載)
有一點我想和大家重溫一下:(如果你的類裏面有拷貝構造函數和賦值運算符重載)
A a1; //這裏可能需要傳參
A a2 = a1; //此時調用拷貝構造函數
A a3;
a3 = a1; //此時調用賦值運算符重載函數
還有繼承與組合都有的時候調用構造函數的順序:
class A
{
int i;
public:
A(int newi = 0) : i(newi)
{
cout << "A" << endl;
}
~A()
{
cout << "~A" << endl;
}
};
class B : public A
{
A j;
public:
B(int newj = 0) : j(newj)
{
cout << "B" << endl;
}
~B()
{
cout << "~B" << endl;
}
};
int main()
{
B b(5);
return 0;
}
不好意思,原題比這個要複雜,我一時記不起來了。無名對象也是常考的對象。很多時候用無名對象實例化另一個對象,往往不會調用兩次構造函數的。
#include<iostream>
using namespace std;
class A
{
char *name;
public:
A(char *pname = "noname")
{
name = new char[strlen(pname)+1];
strcpy(name,pname);
name[strlen(pname)] = '/0';
cout << "A: " << name << endl;
}
A(const A& a)
{
name = new char[strlen(a.name)+1];
strcpy(name,a.name);
name[strlen(a.name)] = '/0';
cout << "A copy: " << name << endl;
}
~A() {cout << "~A" << endl;}
};
void fn(A a)
{
cout << "A fn()" << endl; //這裏可能會更復雜一點,如A fn(A a) 返回臨時對象
}
int main()
{
A b = A("Rose");
A& c = A("Lily");
fn(A("Jim")); //以上是無名對象的三種經典的用法,考慮一下爲什麼不調用拷貝構造
return 0;
}
我只能記住這些啦,關於構造函數和析構函數的試題可能都大同小異,我們一定要花點時間去好好深入研究研究,別到時候在簡單問題上栽了跟頭!
本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/cheng_fengming/archive/2009/08/29/4496275.aspx