關於構造函數和析構函數的一些例子

今天去參加了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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章