アカウント名:
パスワード:
と言ってるだけだな。Cの何が悪いかちゃんと理解できればC++できちんとしたコード書けるだろ。Windowsにはmanaged objectだとかもあるだろ。取り替えられるならとっくにやってる&あんたが知らないだけだと思われ。
今のC++は複雑すぎるだろう。新しい言語の成果をどんどん取り入れるのはいいが、頑なに互換性を守るために歪な文法を強いられる。Cの良いところは、言語使用が小さく一行一行がどういう機械語に置き換わるか予想できるところ。モダンC++は a = b;とだけ書かれていても凡人には想像も及ばないことが行われていたりする。
あと、C++のコミュニティが最悪だね。間違った理解やちょっと古臭いコードを書くと「そんなことも知らないんですか。勉強して出直してきてください」だもんな。
凡人だけどa = b;と書かれていれば代入演算子が呼ばれてるんだろうなってことがわかるけどそれが想像できないってモダンな他の言語やスクリプトを書けないレベルだろ
左辺の型によって代入演算子だったり初期化演算子だったりする。右辺値の評価結果がconst参照を返す関数の場合、右辺の関数のreturn文で左辺が直接初期化される。
初期化演算子って何?auto a = func();ならともかくa = func();でRVOが働くとは思えんがそもそもRVOが働くのはconst参照に限らないけど
初期化演算子やらRVOへの無理解やらこれは勉強して出直せって言われても仕方のないことなのでは…
代入が実行されようが直接初期化されようが正常に動くようにコンストラクタや演算子を実装すべきというだけの話であって、C++ではそれらの違いを常々意識しながらプログラミングしなければならないという話ではない。
そうだね。実装す「べき」。「べき」で済ませる人にはc++は向かない。
やったね!!!
代入演算子が信用できないって話だろ。実際、カウンタを回したりしてるんだし。
C#の場合a.xは何が起きるかわからないしrustでもa + bがどうなるかもわからんぞ演算子が代わりに関数を呼び出すっていうのはモダンな言語では当たり前に実装されてるしそこがC++は複雑だとはならんだろう
航空宇宙とか高い信頼性を要求される分野で単純なオペレータが見た目どおりでないのは邪魔なだけ。言語仕様の隅から隅まで読んで、コンパイラの出力したバイナリまで確認しなきゃ動作に不安をもつようだとC言語の一部のアプリケーションの置き換えは不可能。
議論にロケットサイエンス
航空宇宙用とかの高い信頼性を要求される分野に特化された言語であるAdaにも演算子のオーバーロードあるじゃん?
カウンタ回すってshared_ptrの事かな?リファレンスカウント方式のGCなんて他の色々な言語でも使われてるけど、そういう言語も使えないの?
> 凡人だけどa = b;と書かれていれば代入演算子が呼ばれてるんだろうなってことがわかるけど
私にはこの =演算子がどこでどのように定義されているか簡単にはわかりませんね。
a.f();でfがどこでどのように定義されているか簡単にはわからないなんて言う人はいないでしょ?aの型の定義を見ればいいと思います
演算子がオーバーライドされていることを知っていれば、調べようという気が起きるでしょうけど、起きなかったらそれまでですね。
調べるのも開発環境のサポートがあるから簡単なだけで、無ければ結構手間ですね。
C以上にフリーダムであり、演算子が想像通りの動きをしてくれるとは限らず、人によってはむしろバグの温床になったりしませんかね。
話のすり替え乙
いや、「演算子オーバーロードを乱用すべきではない」というのはあるのでは?(特に代入演算子のオーバーロード)固有の実装が行われていることが判別しづらいので。
C++は色々な出自のライブラリを組み合わせるとそこら辺で各ライブラリで方針が異なっていて非情に厄介ですね。他の言語なら「ベンダ毎の方針が異なるの当たり前だろ?」となるのだが、C++だと最悪組合せを諦める事になる。
aの型がわからないことも多いわけで。
> a.f();でfがどこでどのように定義されているか簡単にはわからないなんて言う人はいないでしょ?
動的ディスパッチをまさにそういう理由で嫌う人は大勢いますねlinusとかerlangのjoe armstrongとかclojureのhickyとかjanes streetなど金融系とかそれを知らないということは、つまりあなたが大したプログラマではないということです
例えばaの型がクラスAだとして、そこにはf()の定義が無いかもしれません。そうなるとクラス階層をたどる必要があります。クラスAの上位のどこかのクラスにf()の定義があっても、純粋仮想関数かもしれません。そうするとAの複数ある派生クラスのうち実行時にaがどの型なのかを知る必要があります。
デバッグで動かしてトレース出来る状況なら分かりやすいでしょうが、ソースコードから追うのは簡単じゃないと思いますよ。
C++ でそういう想像をしたら危ない。
より多くのコメントがこの議論にあるかもしれませんが、JavaScriptが有効ではない環境を使用している場合、クラシックなコメントシステム(D1)に設定を変更する必要があります。
「毎々お世話になっております。仕様書を頂きたく。」「拝承」 -- ある会社の日常
女房と言語は新しい方がいい (スコア:1)
と言ってるだけだな。
Cの何が悪いかちゃんと理解できればC++できちんとしたコード書けるだろ。
Windowsにはmanaged objectだとかもあるだろ。
取り替えられるならとっくにやってる&あんたが知らないだけだと思われ。
Re: (スコア:1)
今のC++は複雑すぎるだろう。
新しい言語の成果をどんどん取り入れるのはいいが、頑なに互換性を守るために歪な文法を強いられる。
Cの良いところは、言語使用が小さく一行一行がどういう機械語に置き換わるか予想できるところ。
モダンC++は a = b;とだけ書かれていても凡人には想像も及ばないことが行われていたりする。
あと、C++のコミュニティが最悪だね。
間違った理解やちょっと古臭いコードを書くと「そんなことも知らないんですか。勉強して出直してきてください」だもんな。
Re:女房と言語は新しい方がいい (スコア:0)
凡人だけどa = b;と書かれていれば代入演算子が呼ばれてるんだろうなってことがわかるけど
それが想像できないってモダンな他の言語やスクリプトを書けないレベルだろ
Re:女房と言語は新しい方がいい (スコア:1)
左辺の型によって代入演算子だったり初期化演算子だったりする。
右辺値の評価結果がconst参照を返す関数の場合、右辺の関数のreturn文で左辺が直接初期化される。
Re: (スコア:0)
初期化演算子って何?
auto a = func();
ならともかく
a = func();
でRVOが働くとは思えんが
そもそもRVOが働くのはconst参照に限らないけど
初期化演算子やらRVOへの無理解やらこれは勉強して出直せって言われても仕方のないことなのでは…
Re: (スコア:0)
代入が実行されようが直接初期化されようが正常に動くようにコンストラクタや演算子を実装すべきというだけの話であって、
C++ではそれらの違いを常々意識しながらプログラミングしなければならないという話ではない。
Re: (スコア:0)
そうだね。実装す「べき」。
「べき」で済ませる人にはc++は向かない。
Re: (スコア:0)
やったね!!!
Re:女房と言語は新しい方がいい (スコア:1)
代入演算子が信用できないって話だろ。実際、カウンタを回したりしてるんだし。
Re:女房と言語は新しい方がいい (スコア:1)
C#の場合
a.xは何が起きるかわからないし
rustでも
a + bがどうなるかもわからんぞ
演算子が代わりに関数を呼び出すっていうのはモダンな言語では当たり前に実装されてるし
そこがC++は複雑だとはならんだろう
Re: (スコア:0)
航空宇宙とか高い信頼性を要求される分野で単純なオペレータが見た目どおりでないのは邪魔なだけ。
言語仕様の隅から隅まで読んで、コンパイラの出力したバイナリまで確認しなきゃ動作に不安を
もつようだとC言語の一部のアプリケーションの置き換えは不可能。
Re: (スコア:0)
議論にロケットサイエンス
Re: (スコア:0)
航空宇宙用とかの高い信頼性を要求される分野に特化された言語であるAdaにも演算子のオーバーロードあるじゃん?
Re: (スコア:0)
カウンタ回すってshared_ptrの事かな?
リファレンスカウント方式のGCなんて他の色々な言語でも使われてるけど、そういう言語も使えないの?
Re: (スコア:0)
> 凡人だけどa = b;と書かれていれば代入演算子が呼ばれてるんだろうなってことがわかるけど
私にはこの =演算子がどこでどのように定義されているか簡単にはわかりませんね。
Re: (スコア:0)
a.f();でfがどこでどのように定義されているか簡単にはわからないなんて言う人はいないでしょ?
aの型の定義を見ればいいと思います
Re:女房と言語は新しい方がいい (スコア:1)
演算子がオーバーライドされていることを知っていれば、
調べようという気が起きるでしょうけど、起きなかったらそれまでですね。
調べるのも開発環境のサポートがあるから簡単なだけで、無ければ結構手間ですね。
C以上にフリーダムであり、演算子が想像通りの動きをしてくれるとは限らず、
人によってはむしろバグの温床になったりしませんかね。
Re: (スコア:0)
話のすり替え乙
Re: (スコア:0)
いや、「演算子オーバーロードを乱用すべきではない」というのはあるのでは?
(特に代入演算子のオーバーロード)
固有の実装が行われていることが判別しづらいので。
Re:女房と言語は新しい方がいい (スコア:1)
C++は色々な出自のライブラリを組み合わせるとそこら辺で各ライブラリで方針が異なっていて非情に厄介ですね。
他の言語なら「ベンダ毎の方針が異なるの当たり前だろ?」となるのだが、C++だと最悪組合せを諦める事になる。
Re: (スコア:0)
aの型がわからないことも多いわけで。
Re: (スコア:0)
> a.f();でfがどこでどのように定義されているか簡単にはわからないなんて言う人はいないでしょ?
動的ディスパッチをまさにそういう理由で嫌う人は大勢いますね
linusとかerlangのjoe armstrongとかclojureのhickyとかjanes streetなど金融系とか
それを知らないということは、つまりあなたが大したプログラマではないということです
Re: (スコア:0)
例えばaの型がクラスAだとして、そこにはf()の定義が無いかもしれません。
そうなるとクラス階層をたどる必要があります。
クラスAの上位のどこかのクラスにf()の定義があっても、純粋仮想関数かもしれません。
そうするとAの複数ある派生クラスのうち実行時にaがどの型なのかを知る必要があります。
デバッグで動かしてトレース出来る状況なら分かりやすいでしょうが、ソースコードから追うのは簡単じゃないと思いますよ。
Re: (スコア:0)
C++ でそういう想像をしたら危ない。