2016-05-29 70 views
3
#include <iostream> 
using namespace std; 

class teacher{ 
private: 
    int Tnum; 
public: 

    teacher(){ 
     Tnum = 0; 
    } 
    teacher(int n){ 
     cout << "creating teacher"<<endl; 
     Tnum = n; 
    } 
    ~teacher(){ 
     cout << "destroying teacher" << endl; 

    } 
}; 

class student: public teacher{ 

private: 
    int Snum; 

public: 
    student(){ 
     Snum =0; 
    } 

    student(int n){ 
     cout << " creating student"<<endl; 
     Snum = n; 
    } 
    ~student(){ 
     cout << "destroying student"<<endl; 
     teacher t(1); 
     cout << "teacher created"<<endl; 
    } 
}; 

int main(){ 

    teacher t(20); 
    student s(30); 

} 
+0

C++允許你這樣做,但它根本沒有任何意義。你想做什麼? – ConsistentProgrammer

+0

那麼,它可以說是有道理的。例如,您可以創建一個類的實例,將更改寫入數據庫。當然,你有一個問題就是創建一個對象可能會拋出一個異常,並且*析構函數不應該拋出*。 –

回答

3

你展示了一個編譯的例子。怎麼了?
它的行爲就像在任何其他函數中創建的對象,並且一旦超出範圍就會被銷燬。

12.4p8我們發現:

執行析構函數的身體和破壞人體內部分配的任何自動對象後[...]

這證實了創建中的對象析構函數的主體是合法的。

但是,要小心!如果這些對象的構造函數拋出異常,它可能會傷害到你,因爲析構函數是非拋出的,遇到異常會導致應用程序終止。

+1

值得明確指出,析構函數只是一個函數,當對象被銷燬時它會被自動調用。除了缺少返回類型和'noexcept'外,它只是一個函數。 – Kittsil

+0

或多或少。它屬於標準的[特殊成員函數](http://eel.is/c++draft/#special)部分。無論如何,我明白你的意思。 – skypjack

相關問題