C++編 目次

 コンストラクタ
  /デストラクタ

 


・メンバイニシャライザでの初期化順序

・オブジェクトを作った後に初期化する
・明示的なブロック化

 演算子

 

・代入演算子のオーバーロード

 文字列操作

 

・stringの多重連結を使用した代入

 

 


トップページへ戻る

明示的なブロック化

 C++では、関数内にブロックを作り、ブロック内にローカル変数をとることができます。この変数はブロック内でのみ有効になります。次の例題を見てみましょう。

 この関数は、一時的なスクリプトファイルを作り、実行する関数です。

#define SH_PATH    "/home/user/bin/cpy.sh"

void MyApp::Copy()
{
    int     err = 0;

    // 明示的なブロック化
    {
        ofstream   ostr(SH_PATH);
        
        if (!ostr) err = 1;
        if (!err)
        {
            ostr << "#!/bin/bash\n";
            ostr << "\n";
            ostr << "cp -p /home/user/old/* /home/user/new/*\n";
            ostr << "rm -f " << SH_PATH << endl;
        }
    }
    if (!err)
    {
        chmod(SH_PATH, ACCESSPERMS);
        system(SH_PATH);
    }
    return;
}

 ここで、ofstream型の変数ostrは、明示的なブロック内にとっています。これは、スクリプトを実行する前に、ostrのデストラクタを呼び出すためです。ブロック内にとった変数のスコープはブロック内のみです。ブロックを抜けた段階でデストラクタが呼ばれます。

 fstream系のクラスは、デストラクタでファイルクローズされるので、こうしておくとファイルをクローズしてから安全にスクリプトを実行できるというわけです。

 このように、明示的なブロック化をすると、デストラクタが実行されるタイミングを制御することができます。