C++で変換演算子のオーバーロードを定義する2つのスタイルを見てきました。
operator int* (void) const
operator int*() const
質問1.2つのスタイル(追加するかどうかに関係void
なく)は同じ機能を持っていると思いますよね?
質問2.どちらが良いですか?
これは、変換演算子だけでなく、パラメーターを受け取らないC++のすべての関数に適用されます。void
個人的には、一貫性を保つために省略したいと思います。
慣例はCに由来します。元々、Cにプロトタイプがなかった場合、関数宣言で空の括弧のペアが使用され、関数が期待するパラメーターに関する情報は提供されませんでした。
プロトタイプが追加されたとき、柔軟性と下位互換性のために「未指定のパラメーター」を意味する関数宣言のために空の中括弧が保持されました。「パラメータをとらない」という意味の明示的なプロトタイプを提供するために、構文(void)
が追加されました。
C ++では、すべての関数宣言にプロトタイプが必要であるため()
、(void)
同じ意味を持ちます。
ISO C++ FAQ から引用すると、またはを使用する必要がありますf(void)
かf()
?
C プログラマー
f(void)
は、パラメーターを取らない関数を宣言するときによく使用しますが、C++ ではそれは悪いスタイルと見なされます。実際、f(void)
C++ の作成者である Bjarne Stroustrup、C の共同作成者である Dennis Ritchie、および Unix が生まれた研究部門の責任者である Doug McIlroy は、このスタイルを「忌まわしいもの」と呼んでいます。C++ コードを記述している場合は、
f()
. このf(void)
スタイルは C++ では有効ですが、C コードのコンパイルを容易にするためだけです。
当局FTWに訴える:)
C ++では、foo()とfoo(void)は同じです-「引数なし」。C99標準では、前者は「未定義の引数数」を意味し、後者は「引数なし」を意味します。
ただし、Cのfoo()の動作に依存している場合は、撃たれるはずです。
つまり、どちらでも使用できるということです。個人的には、視覚的な混乱が嫌いなので、foo(void)よりもfoo()の方が好きですが、それはただの好みです。私はPythonの男です:)
「古い」C(バージョンがわからない)foo()
は「任意のパラメーター」foo(void)
を意味し、パラメーターを意味しないと信じています。foo()
「任意のパラメーター」バージョンは廃止されました。私は c99 を信じています。
クイック グーグルで検索すると、同様の事実に言及しているこのウィキペディアの記事が見つかります。
C++ は受け入れますが、 「パラメーターなし」を意味foo(void)
するのと同じ意味です。foo()
したがって、C++ で推奨される方法は、 を使用することfoo()
です。
空白を省略します。古いスタイルの C では、すべての関数は であると想定されていint name(...)
ました。void を指定すると、それは可変長パラメーターではありませんでした。そのデフォルトは削除され、すべての関数を指定する必要がありました (ありがたいことに、何でも何でもありえるワイルド ウェストでした)。C++ では (void) と書く必要はありません。省略します。C++ ライブラリと同じように。