2

operator++ダミーの「int」パラメーターを使用して、これらの演算子の後置バージョンをオーバーライドできることは知っていますがoperator--、デストラクタで宣言できるダミーパラメーターについて漠然と覚えています。誰かがそれについて何か知っていますか?もしそうなら、そのダミーパラメータは何をしましたか?

これは私が 10 代の頃 (つまりずっと前) に読んだ古い Turbo C++ チュートリアルの本にあったので、完全に記憶違いかもしれません。これも、標準化される前の非常に初期の C++ であったため、Turbo C++ 固有のものである可能性があります。

4

5 に答える 5

6

あなたはおそらく、次の署名を持つ演算子削除の配置および非スロー形式を考えています。

void operator delete(void *, void *) throw();
void operator delete(void *, const std::nothrow_t&) throw();
void operator delete[](void *, void *) throw();
void operator delete[](void *, const std::nothrow_t&) throw();

これらは通常の操作中に呼び出されることはありませんが、配置 newで構築されているオブジェクトのコンストラクターが例外をスローする場合に使用されます。通常、コンパイラは死んだオブジェクトのベースとメンバーでデストラクタを既に呼び出しており、新しい配置のために解放するメモリがないため、それらを定義する必要はありません。ただし、placement new をオーバーロードしていて、対応する演算子が必要な場合は存在できます。

2 番目の引数は実際には使用されず、署名を通常のものと区別するだけです。

void operator delete(void *)

ただし、これらは operator++ のような特別な仮引数ではありません。これらは、次のような追加の引数を使用して new を呼び出す一般的な規則の単なるインスタンスです。

obj = new(x,y,z) Object(a,b,c) 

同じ追加の引数をオペレーター delete に渡すコンストラクターエラーからクリーンアップするための暗黙的なコードを生成します。これは (ほぼ) 次のように機能します。

void *raw = operator new(sizeof(Object), x,y,z)
try {
    obj = new(raw) Object(a,b,c);
} catch(...) {
   operator delete(raw,x,y,z);
   throw;
}
于 2008-11-06T03:29:58.537 に答える
5

記憶が間違っているか、忘れようとする必要があります。デストラクタにはパラメータがなく、戻り値の型があり、例外をスローするべきではありません。

于 2008-11-06T02:31:30.183 に答える
2

確かに同じことを聞いたことがありますが、C++ の FAQ には、そのようなフォームは存在しないと書かれているようです。

于 2008-11-06T02:33:32.470 に答える
2

おそらく、あなたは新しい配置を考えていますか?

class MyClass { /* ... */ };

char * raw_mem = new char [sizeof (MyClass)];
pMyClass = new (raw_mem) MyClass;
// ...
pMyClass-->(~MyClass());
delete[] raw_mem;
于 2008-11-06T02:44:32.980 に答える
1

あなたは狂っていません。以前にデストラクタで int パラメータを見たことがあります。OpenVMS で HP のコンパイラを使用して、以下に示すサンプル プログラムをコンパイルしました。シンボルのリストには、int パラメータを持つデストラクタが含まれています。これはコンパイラ固有のものだとしか思えません。

$ create foo.cxx
class foo
{
 ~foo() {}
};

$ cxx foo.cxx

$ type [.CXX_REPOSITORY]cxx$demangler_db.
CX3$_ZN3FOOD1EV31GNTHJ         foo::$complete$~foo()
CX3$_ZN3FOOD2EV30KQI3A         foo::$subobject$~foo()
CX3$_ZN3FOOD9EV36HH9SB         foo::~foo(int)
CXXL$_ZDLPV                    void operator delete(void *)
于 2008-11-19T03:02:20.170 に答える