2016-05-29 8 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

関連する問題