2011-01-05 29 views
13

私は知っている単一の信頼できる方法は、すべてのコンストラクタを明示的に宣言してから、暗黙のうちにこのキーワードを削除することです(単一引数のコンストラクタだけでなく、これを可能にする標準のおかげで)。しかし、これは醜いように見えるだろう。コンストラクタがデフォルトで明示的でない理由

暗黙のコンストラクタは、(間違った)暗黙の変換の使用を意図していません。 hereとなります。これは偶然に起こる可能性がありますか、後方互換性を損なう可能性があります。

なぜ、明示的にコンストラクターのデフォルト特性ではないのはなぜですか?

p.s.ええ、私はStroustrupの "The Design and Evolution of C++"を読んで、そこに「明示的」なことについて何か言わなければ覚えていません。

+0

「忘れている」経験がなくなってしまう –

+3

@Gene:おそらく、目に見えるものをすべて「明示的」にしたいとします。 –

+0

@robinフード:あなたのリンクに関しては、私の見解では、そこにある問題は暗黙的な変換ではありませんが、 "関数がAオブジェクトしか取らず、Aオブジェクトがループ。"問題が驚くべきコード効果である場合、その答えは言語をダンピングするよりも、より良いプログラマでなければなりません。もちろん、世界のC#/ Java/VBのファンは異なる意見を持っているかもしれません。 –

答えて

12

明示的に追加された時の下位互換性。言語は進化しており、進化する言語で既存の構造の意味を変えることは、ユーザーを怒らせる確実な方法です。それでも今のところ、下位互換性は委員会の心の中で高いものです。

+0

心の中だけではありません。それは委任です。 –

+0

(少なくとも、ほとんどの場合、いくつかの新しいキーワードは、*議論の的となっています* ...彼らは誰も紹介しないために最善を尽くしています!) –

3

興味深い見所。私は反対側を取る傾向があり、あなたはなぜあなたがあなたのコンストラクタをすべてマークする必要があると思うのだろうと疑問に思うでしょうか?explicitそうでないと証明されるまで?

誠に申し訳ありませんが、私はあなたの質問への答えを知りません。下位互換性は、もっともらしい理由のために候補になるかもしれないようですが、なぜ、暗黙の変換を防ぐのはなぜですか?

+6

暗黙の変換は時々驚くべきプログラムの動作につながります。私は良い例を思い出すことができたらいいと思う。私はそれが多くの場合有害であるよりも有用であると感じます。 –

+4

型マッチングは、表現の合法性や過負荷解決などのためにC++では重要であり、非 '明示的な 'コンストラクタはそれらの目的のための型変換器です。たとえば、 'A :: A(B b)'と 'foo(A a)'が宣言されている場合、 'B b; foo(b);は合法的になり、それはしばしばエラーとしてフラグを立てたいものです。自動変換は、過負荷の機能の驚くべき選択を強制する可能性があり、驚きが悪いものはすべてです。一般に、C++のプログラマは暗黙の型変換が悪いことにますます合意しているようです。 –

+1

は、(間違った)暗黙の型変換を意図したものではないため、開かれています。ここでは:http://en.allexperts.com/q/C-1040/2010/2/C-Implicit-Conversion.htm。これは偶然に起こる可能性があります。この例を含めるために修正されたオリジナル投稿 –

8

C++が考え出されたとき、だれも愚かなコードを書くことはないと考えられていました。誰もが素晴らしい暗黙の変換があらゆる場所でキャストを書かなくて済むという利点を享受します。

もちろん、これは誤っていることが分かりました。実際には、バグの多いコンストラクタがあります。。残念だ。

+4

+1これは私のためにそれを要約すると思います。それでは、プログラマーが愚かなコードを書いているとどうなるのでしょうか?多くの人は、言語がより簡単になるべきだと思うので、愚かなプログラマは愚かなコードを書くことはできません。私の意見は、プログラマーをより賢くする方が良いということです。より良いプログラマが優れたプログラムを書く。 –

+0

欠陥のあるコンストラクタ以外の明示的なコンストラクタを必要とする多くの正当な理由があります。愚かなコードとしてそれを書くことは間違っています。 –

+0

私はジョンに同意します。 –

関連する問題