CとC ++を知っているのに、なぜC ++ 11を学ぶのですか?[閉まっている]


28

私はCとC ++のプログラマーですが、どちらの言語にも固執せず、2つの混合物を作成します。場合によっては、演算子のオーバーロードやテンプレートを使用したクラス内のコードを使用することもありますが、非常に優れたSTLは明らかに優れた方法です。単純なC関数ポインターを使用すると、はるかに読みやすく、明確になる場合があります。だから、私は両方の言語に美しさと実用性を見出しています。「それらを混ぜてC ++コンパイラでコンパイルすれば、それはもはや混同ではなく、すべてC ++である」という議論には入りたくありません。また、C対C ++については説明しません。この質問はすべてC ++ 11についてです。

C ++ 11では、C ++の動作に大きな変化があると思うものを紹介していますが、さまざまな機能が異なる状況でどのように動作するかを変更する多くの特殊なケース、例外、不規則性を導入し、多重継承、キーワードとして機能する識別子、拡張機能を制限しています文字列リテラル、ラムダ関数変数のキャプチャなど

将来のある時点で、C ++と言うとき、誰もがC ++ 11を想定することを知っています。最近Cを言うときと同じように、おそらくC99を意味します。そのため、C ++ 11の学習を検討します。結局、C ++でコードを書き続けたい場合、同僚が持っているという理由だけで、これらの機能の使用を開始する必要があるかもしれません。

Cを例にとります。何年も経った今でも、Cでコードを学んだり書いたりする人がたくさんいます。なぜですか?言語が良いからです。良い意味は、優れたプログラミング言語を作成するための多くの規則に従っていることです。そのため、Cは強力である(ほとんどすべてのプログラミング言語がそうであるか難しい)ことに加えて、Cは規則的であり、もしあれば例外はほとんどありません。しかし、C ++ 11はそうは思いません。C ++ 11で導入された変更によって言語が改善されているかどうかはわかりません。

質問は次のとおりです。なぜC ++ 11を学ぶのでしょうか。

learning  c++  c  c++11 

3
私はこのフォーラムにC ++ 11の暴言があってはならないことを理解しており、これに完全に同意します。すべての開発者には、プログラミング言語とツールに関する個人的な好みを持つ権利があります。しかし、私にとってははるかに実際的な問題があります:私はC ++開発者であり、C ++ 11が好きではありません。C++ 11を使用するか、市場から出るか、別の言語に切り替える必要がありますか数年?
ジョルジオ

まあ、それについて少し考えました。もちろん、Dプログラミング言語やGoなど、より最新のゼロからの言語があります。これらはあなたの問題の領域に適している、より一貫性が高いなどです。しかし、市場シェア..業界の主要なプレーヤーはどれもDをサポートしておらず、GoでもGoogleの「実験」の1つであるようです。 +11は、読みやすく、安全で、より高速なコードを作成できるようにする便利な改善であり、幅広い業界のサポートが必要です。
ニルス

@giorgio、過去2年間、私は以前と同じようにC ++の使用をやめました(主に宗教的なC ++ファンがどのようになっているのかを理解し、この質問の答えを読んだため) C ++ 11を使用しました。私の経験はこれでした。C++ 11はC ++の多くのくだらないコーナーに対処しますが、それは見事であり、実際に改善されています。独自のくだらないコーナーがあります(元の編集されていない投稿を参照)。ただし、 "通常の方法"(将来の使用のためにラムダを格納しないなど)を行う場合、これらのくだらないコーナーは邪魔にならないようです。

@giorgio、つまり、C ++ 11は最初はひどく見えるかもしれません。実際、C ++自体はひどいように見えますが、C ++で大丈夫なら、おそらくC ++ 11も好きでしょう。くだらない部分には触れないでください。実際に楽しむことができます。

@anon:言語のくだらない部分を取り除くための1つの方法は、AppleがSwiftで行っているように、過去を切り捨てて新しい言語を開始することです(多数の例のうちの1つにすぎません)。レガシーコードとのインターフェイスは、個別のコンパイルによって実行できます。C ++の問題は、C ++が1つの真の言語であると宗教的に信じているファンのコミュニティによってサポートされているためと思われます。結論:C ++ 03は少し安っぽいですが、特にQtやboostなどのライブラリのおかげで、仕事は完了しました。一方、私はC ++ 11から手を離します。
ジョルジオ14

回答:


24

あなたが仕事を得るために将来それを知る必要があると思うなら、あなたはそれを学ぶべきです。あなたがC / C ++として(そしてあなたが知っているかもしれない他の何でも)あなたが労働力で市場性を保つと確信しているなら、それを学ばないでください。上司からC ++ 11を使用するように指示された場合は、「いいえ、そうしません」と言います。彼があなたを解雇した場合は、どこか別の場所に行きましょう。あなたがすぐにあなたが現在知っているスキルで満足のいく雇用を見つけることができないと予測するとき、C ++ 11を学んでください。

私の理論的根拠を明確にしたかった:私は反C ++ 11ではない。OPの質問を「なぜXを学ぶべきか」に一般化できると言っているだけです。私はCとC ++で仕事をしているので、ML、スキーム、またはhaskellを学んだことはありません。これらの言語は誰かにとって有用であると確信していますが、今すぐ学ぶことは私にとって有益ではありません。誰かがMLでプログラムするのに良いお金を提供してくれたら、それを学ぼうとするかもしれません。


3
あなたが「C / C ++」開発者であり、上司がC ++ 11を使用するように指示した場合、先に進んでそれを武器庫に追加してはいけませんか?言語を学ぶためだけに言語の学習に時間を費やすべきではないことに同意しますが、上司が「これを学ぶ」と言ったら、先に進んで学習することをお勧めします。また、次のアプリケーションで不服従で解雇されたことを説明する必要がなく、市場性が高まります。
パンツァークライシス14

Haskell ...おかしい、C ++にラムダがゆっくりと含まれているため。:P
rbaleksandar

85

簡単だ。C ++ 11を使用すると、コードが劇的に簡単になり、記述が簡潔になり、高速になります。

nullptrは古いものに対するVAST改善0です。それはタイプセーフであり、そうすべきではないときに変換しません0。に変換されないのは良いことです。それはまったく意味がありません。C ++委員会が検討を試みたときに見つかったことを知っていますか?のようなもの。それはどれほどひどいですか?ので、例外がここにあります唯一の理由はかなりwrong-ですが、前、及びC.でC ++で事実があったことを、整数型、と考えられている変換されていない良い、それはだ偉大な、あなたはそれを愛する必要があります。nullptrint#define NULL nullptrchar c = NULL;boolnullptr

または、右辺値参照と可変長テンプレートはどうですか?より速く、より一般的なコード。それはそこに完全な勝利です。

ライブラリの改善はどうですか?以下のようなものfunctionunique_ptrshared_ptrされているので、はるかに優れたものを前に、それはC ++ 03の方法が優れていたと主張することは不可能でありますより。

#define adding_func(x, y) ((x)+(y))

リモートでも同等ではありません。マクロは60億の理由で悪いです。ここですべてを引用するつもりはありませんが、マクロは回避できる可能性のあるほとんどすべての目的で回避する必要があることはよく知られています。それが起こったら何をしますか

#define add_twice(x) (x + x)

ああ待って、私はあなたがインクリメントまたは上のものではありませんでした願っていますx。テンプレート関数のバージョンは完全に影響を受けません。また、たとえば名前空間に感謝しないことを願っています。

次に、スコープが既に終了している外部変数を使用するための未定義の動作の世界を開きます。

STLアルゴリズムなどの機能的なAPIでは、参照は問題ありません。保存されたコールバックの場合、値でキャプチャする必要があります。関数に関するドキュメントが何であれ、どれが必要かを明確に示す必要があります。コードがラムダで記述されているという事実は、ローカル変数を参照する問題とは無関係です。通常の関数オブジェクトを渡すと、まったく同じ問題が発生します。そして、それは問題ではありません。まったく。ローカル変数を参照できる場合とできない場合は、本質的に明らかだからです。

Cを例にとります。何年も経った今でも、Cでコードを学んだり書いたりする人がたくさんいます。なぜですか?

朝に歯を磨かない人がたくさんいます。多くの殺人者、強姦犯、売春婦がいます。そして政治家。自殺した人。したがって、それによってこれらの活動が良好または有用になると主張しますか?もちろん違います。誰かがやったからといって、それは良いか、役に立つはずだというのは論理的な誤fallです。

Cはまだ3つの理由で作成されています。C++は、組み込みモードやカーネルモードなどで実装するのが難しいからです。レガシーコードベースはCで記述されており、アップグレードに多額の費用がかかるため、C ++の優れたC相互運用性を考えると、それでも疑問です。そして、それを書いている人々はプログラムする方法を知らないからです。それでおしまい。Cを記述する他の理由はありません。

Cまたは古いスタイルのC ++を使用する場合、多くの例外は見つかりません。

単純な例として、哀れなCスタイルの配列はどうですか?頭の中でまっすぐ配列やポインタを取得できない人の数はわいせつです。C標準ライブラリが非常に安全でないという事実は言うまでもありません。

あなたの核となる議論は、論理的な誤fallと誤解に満ちています。


7
> nullptrが変換しないという事実は良いことであり、素晴らしいことであり、あなたはそれを愛すべきです。ご意見をよろしくお願いしますが、誰か他の人が何を愛すべきかについてしばらく落ち着いてください。
エミリオガラヴァリア

5
あなたの答えの後半は、なぜC ++がCよりも優先されるべきかということの詳細だと思います。それは問題外です。「Cライブラリは安全ではありません」-これは一体どのように質問に答えますか?もちろん、C ++ 11が提供する新機能を学ぶ必要がありますが、CとC ++は同じことを行うことを意図したものではありません。C ++が低レベルで実装するのが面倒なら、C#、Java、Pythonなども低レベルで実行することを意図していないためです。C ++がネイティブコードにコンパイルされるからといって、オブジェクト指向とそれに関連するページスラッシングを重要なカーネルレベルのコードに使用できるわけではありません。
ヤティサガデ

11
@Shahbaz、明らかに、プログラミング言語(たとえば、型システム、レキシカルスコープなど)についてもう少し学ぶ必要があります。すべてのコメントは完全に同期していません。:この本でスタートamazon.com/Theories-Programming-Languages-John-Reynolds/dp/...
SK-ロジック

5
@yati:C ++にはCと同じモジュールシステムがあります。メンバー関数は単純な古いC関数として実装されます。仮想関数は、DLLから関数をロードするのと同じように実装されます。それらについてスラッシングするページは何もありません。そして、はい、それはほとんど間違いなく適用されます。最初に、Unixが最良であるというあなたの信念は主観的です。そうでなければ、5%の市場占有率が示唆されます。第二に、たとえ私がUnixを絶え間なく愛していたとしても、1つの例はトレンドを設定しません。あなたが引用する他の例でも同じことが言えます。どんな例?無意味です。C ++は、Cと同様にプロシージャに適しています。
DeadMG

8
@yatisagade C ++はマルチパラダイム言語であり、すべてに仮想機能を強制するわけではありません。C++での私のプログラムも同様です。その一部はオブジェクト指向設計を使用し、一部は機能的など、特定の副問題を最もよく解決するものに応じて使用されます。オブジェクト指向スタイルを追加してくれたC ++に感謝し、関数型プログラミングのサポートを大幅に拡張してくれたC ++ 11に感謝します。
デビッドストーン

29

C ++ 11は新しい言語ではありません。既に知っているのはC ++の拡張/変更のみです。C ++ 11は、他のプログラミング言語と同様に機能で構成されています。それらの多くは以前から存在していましたが、一部は新しいものです。しかし、あなたの質問は本当に、言語のすべての機能(この場合はC ++ 11)を学ぶべきなのか、それとも90%しか知らないのか、ということです。

IMOは、すべての言語を使用していなくても、少なくとも新しい機能が何をするのかを読んでおく必要があります。それらの多くは、ライブラリ/フレームワークコード(特にテンプレート)を簡単に記述できるようにするために導入されました(たとえば、C ++ 11の完全な転送が不可能になる前)。これらの機能がC ++ 11で追加されたことに注意してください。

一方、以前に一部のSTL / Boost機能を模倣するライブラリ/コアコードの作成に手を出し、95%が非常にクールでエレガントなソリューションを手に入れたので、言語によって制限されていることに気付いた場合、言語が単にあなたが望むものをサポートしていないことがわかったので、あなたは止められました。あなたはC ++ 11の本当に素晴らしい力に気付くでしょう。私たちのチームがVS2010にアップグレードしてから(そして、その過程でBoostを発見したので)、r値参照やテンプレートパラメーターの転送などの前には不可能だった、いくつかのクレイジーで素晴らしいコードを作成することができました。

また、ラムダのようなものは外見的に見えるかもしれませんが、新しいコンストラクトを導入しません。代わりに、以前のものが非常に簡単に記述できるようになります。以前は、すべてのラムダ関数は個別のクラスである必要がありました。現在は{... code ...}です。大好きです。

重要なのは、これらの機能を見て、リストがどれほど難しいかを考えないことです。代わりに、通常どおりにC ++を使用し、これらの新しいC ++ 11機能が役立つシナリオに出くわすと(90%を超える人々がそのポイントに到達することはありません)、拡張機能に非常に満足します言語に行われました。とりあえず、言語のすべてを使用する方法とは限らず、何がそこにあるのかを知るのに十分なだけ言語について学ぶことをお勧めします。


7
@Shahbaz-名前のない関数が追加された理由の意図がまだ失われていると思います。また、「変数を入力として使用せずに使用する」ことはクロージャーと呼ばれ、他の多くの高水準言語で使用できます。ファンクターオブジェクトを使用して多くのテンプレートコードを記述した場合、C ++ 11を使用すると、両手を広げてラムダ関数を使用できます。このように考えてください...コンパイラがマシンコードを生成するとき、テンプレート関数やクラスなどはありません。それらはすべて、その時点より前に具体的なクラス/関数を作成するために「インスタンス化」されます。それは...ステートフルに来るときラムダは同じものです
DXM

5
...ファンクター。各タイプのファンクターと渡すすべてのクロージャー要素に対応する大量のコードを作成する代わりに、C ++ 11ではショートカット構文を指定することができ、内部ファンクタークラス全体を自動的にインスタンス化します。テンプレートをインスタンス化します。ここでも、これらの機能のほとんどは、アプリケーションレベルのコードの98%で使用されることはありませんが、彼らははるかに強力かつ実装/保守/デバッグを容易にすることをSTL /ブーストのようなライブラリを作るために追加されたことを覚えておいてください
DXM

10
@Shahbaz:さて、あなたはラムダ関数やクロージャを理解していません。それは合理的です。それらが多くの異なる言語で使用されているという事実は、それらがあなたがそれらを理解しているかどうかにかかわらず、それらが有用であることを示唆するべきです。
デビッドソーンリー

8
@Shahbaz:クロージャーがグローバル変数に似ていると思うなら、クロージャーを理解していません。(ヒント:グローバル変数は、どの関数でも変更できるため問題を引き起こします。)実装ではなくラムダの概念を理解していれば、クラスとコードの混乱に起因するものではありません。C ++標準のすべては、多くの知的な人々に納得させる理由でそこにあります。理由に同意する必要はありませんが、理由を知らずに無知から批判しています。
デビッドソーンリー

6
@Shahbaz、存在しない絶対に 閉鎖やグローバルの間には類似性、あなたは完全にポイントを逃しています。これを読む:en.wikipedia.org/wiki/Lambda_calculusとあなたの脳を爆破する:en.wikipedia.org/wiki/Combinatory_logic
SK-logic

18

関数を書くのは非常に難しいのですか?名前を付けないだけでなく、関数の内容をコードとインラインで記述する必要がありますか?

それを行うときは、上にスクロールするか、新しいソースファイルを開いてそこに関数の定義を追加します。その後、戻って作業を続けなければならず、ある程度気が散ります。

それ以外は、他の人があなたを読んでいるとき、「ああ、この関数は何をするの?」と言うのではなく、ラムダが自己文書化する場合があります。その宣言にジャンプすると、独自の場所で何をしているのかを見ることができます。

ハーブ・サッターによるラムダについてのいい話があります。おそらく彼はあなたをよりよく納得させることができます:

http://channel9.msdn.com/events/PDC/PDC10/FT13

さて、なぜラムダ関数にするのではなく、そこにコードを書いてみませんか?

STLアルゴリズムを使用している場合、または関数を渡す必要がある使用中の関数を使用している場合は実行できないためです。

#defineadding_func(x、y)((x)+(y))

ラムダの代わりにこの使用法を正当化する方法はありません。どこでもマクロでコードを埋めることはできません。マクロと関数の目的は異なりますが、一般に、一方は他方の代わりではありません。

template<class Lhs, class Rhs>
auto adding_func(const Lhs &lhs, const Rhs &rhs)
                -> decltype(lhs+rhs) {return lhs + rhs;}

同意する、これはいです。しかし、「コンパイラがこれを推測できるのに、なぜこの式のタイプを把握する必要があるのか​​」と言った自分を覚えています。多くの場合。これはそれらの瞬間に大いに役立つかもしれません。

総括する:

C ++ 11の新機能は構文がugいように見えますが、すぐに慣れることができると思います。すべての新しい言語構造は、最初は学ぶのが困難です。クラス全体を書くことを初めて学んだことを想像してください:ヘッダーファイルに宣言を置き、最後に余分なセミコロンを忘れずに、ソースファイルに定義を入れます。複数の包含、メンバー関数宣言などのスコープ解決演算子を忘れないで...

しかし、いくつかのクラスを書いた後、あなたはそれに慣れるでしょう、そしてあなたはこのプロセスの複雑さについて考えていないことはかなり確信しています:クラスはプログラマーとしての仕事をはるかに簡単にし、ユーティリティはあなたがこの新しい構造から稼いでいるのは、あなたが言語を学ぼうとしていた時のユーティリティの損失よりもずっと大きいです。これが、C ++ 11を同様の方法で学習または使用しようとする理由であると考えられます。


自己文書化やスクロールの減少などに関する議論。「コードの乱雑」、「アクセスの制限」などの反対の議論は、クラス外の関数を禁止する必要がある理由を議論するために一度使用されたと確信しています。どちらが優れているかを判断するには、人々は経験を積む必要があると思います。私には、これは失敗した実験か悪いデザインのどちらかだと思われます。私は、この実験では実験用のネズミではないと確信しています。
シャーバズ

醜い探し構文について、例えばこれら二つを取る:bool is_alive;bool thisSpecialObjectOfMineIsAlive;。どちらも同じことをしますが、2番目は本当にugいようです。どうして?なぜなら、もっと多くの情報を入れることでそれがより明確になると誤って思ったからです。ここでも同じように、Stroustrupは機能を提供することで良いことを意味していましたが、見た目は良くありませんでした。私にはこれは悪いデザインを示しています。
シャーバズ

3
格好良い!=格好良く、格好悪い!=悪い。
DeadMG

@Shahbaz:ラムダは素晴らしい概念だと思います(そしてLispのような言語では長年にわたって存在していました)。Haskellでは多く使用しています。C ++やJavaなどの言語に適合するかどうかはあまりわかりません。彼らは、私にとってはちょっとした後付けのような気がします。なぜ最初からこれらの言語で導入されなかったのですか?StroustrupとGoslinはLispのことを聞いたことがありませんでしたか?
ジョルジオ

8

実際、OPには、ほとんどの回答に関していくつかのポイントがあります。しかし、それらは視覚において「遠い」ものです。C ++(Cサブセットを含む)には長い歴史があり、多くの機能が時間の経過とともに追加され、それらの一部は多かれ少なかれ頻繁に使用され、他の人や他の人に完全に使用されました。

新しい機能を導入した後、古い機能が必要になったり、それと矛盾したりすることがあります。「クリーンな」言語はそのまま一貫したものでなければならず、もはや必要な機能を削除すべきではありません。

しかし、追加しても何も破壊されません。削除(または変更)は、まだ運用中の既存のコードを破壊するため、追加する機能が何であれ、既存のコードを破壊しないように注意する必要があります(特に、意図せずに別のことをするように黙って破壊しないでください))。

そのすべてを学ぶ必要がありますか?はい。すべての機能は、良くも悪くも、遅かれ早かれ使用されるためです。これが言語の「品質」にとって良いものかどうか(客観的な尺度があることを認める)は、別の話です。後方互換性はどれくらいの期間保持されるべきでしょうか?誰かが3年と言い、他の人が50と言うとき、答えを見つけるのは難しい。

C ++をより「通常」に保つための代替手段は、...スクラッチを再起動して、より頻繁に中断することです。しかし、もはやC ++ではなくなります。

同様にそれを行う試みもあります(たとえば、Dを考えてみてください:実際にはC ++(11でも)とはるかに直交しています)が、それらはどれほど人気が​​ありますか?勢いを持つのが難しい理由の1つは、まだ実行する必要がある多くの既存のコードとの非互換性です。

私にとって、C ++ 11は明らかに、新しいニーズと下位互換性の間の妥協点です。その結果、仕様と実装に特定の「混乱」が生じました。その「乱雑さ」のコストが非互換性のコストよりも小さくなるまで...あなたはその妥協に任せなければなりません。

あなたがそれをもう許容できない場合は、...別の若い言語を検討する方が良いでしょう。その意味では、C ++は単純化できません。この年齢ではありません。


私も同意します。そして、開発者として、常に変化する言語(何度も学ばなければならないこと)を持つのは非常に気がかりです。新しい言語を開発する場合は、新たなスタートを切り、別の名前を使用する必要があります。レガシーコードと連携させたい場合は、個別のコンパイルがあります。ですから、ファッショナブルになった最新の機能を組み込むことで既存の言語を変更するというポリシーを本当に理解していません。誰かが言ったように:さらなる開発は自動的に進歩を意味するものではありません。
ジョルジオ

「C ++はその意味で単純化することはできません。この時代ではありません。」:他のプログラミング言語(C、Adaなど)が同じパスをたどらないのはなぜですか?独自のアプリケーションのニッチがあり、すべての可能なアプリケーション領域のツールになるとは思われないからでしょう。
ジョルジオ

@giorgio:はい...あなたはおそらく「実用的な」意味で正しいでしょう。しかし、理論的には... パスカルが「教育用の参照言語」であり、adaが「すべてのプログラミング言語になりたい」という良い日々を覚えています。
エミリオガラヴァリア

また、Pascalでプログラミングを学びました。私が知る限り、エイダはいくつかの改訂を経ましたが、言語の基本設計は破壊されませんでした。CとPascalでも同じです。本当に新しい言語を開発したい場合は、明確に切り分けてD、Java、C#などの新しいものを開始するのに十分な勇気が必要です。C ++が取っている現在のパスに関する私の問題は、それが(不必要に)複雑になりすぎていることです。KISSとYAGNIの原則がソフトウェア設計に適用される場合、プログラミング言語の設計にも適用しないのはなぜですか?
ジョルジオ

@Giorgio:ああ...彼らは適用する...あなたが言った通りに C#またはDが「ボイルアウト」されたC ++(あなたの気持ちの私の解釈)よりも良い選択をしたと思うなら、C ++の代わりにそれらを使用してください。C ++で時間が経つにつれてゆっくりと死にます。今、私はC ++ 11が「沸騰した」C ++ 03に新たな機会を与えており、Dがまだ出発点の障壁を打破するために何かを失っているのを見ています。経済学と企業の利益もまた、開発への資金提供と奨励において役割を果たします。理論的には正しいですが、現実の世界はより複雑です。
エミリオガラ

7

新しいC ++ 11機能を無視することにした場合でも、C ++標準ライブラリがそれらを使用するため、これらの機能を利用できます。たとえば、型の変数を持つC ++ 98ではvector<string>、ベクトルが大きくなったときにコピーの数を作成する必要があるため、パフォーマンスが低下する可能性がありました。C ++ 11移動コンストラクターでは、これは問題ではありません。実際、C ++ 11がより多くの新機能をもたらしました。特に標準ライブラリではそうでした。


6

何年も経った今でも、Cでコードを学んだり書いたりする人がたくさんいます。なぜですか?言語が良いからです。

第一に、最近のほとんどの学生はCではなくJavaまたは.NETを学んでいます。第二に、人々はまだ言語としての利点だけでなく、主にCで書かれた膨大な量の既存のソフトウェアがあるためにCを使用しています多くの場合(組み込みプラットフォームなど)、Cコンパイラがすべて揃っているため、維持および拡張されます。ちなみに、これらは人々がまだCOBOLを書く理由の一部です。

業界のプログラマーが、既存のコードベースに縛られていないまったく新しいプロジェクトで作業を開始し、単独で作業を続けることは非常にまれです。そのため、C ++ 11を学習する理由は、新しい機能を使用する他の人が作成したコードを処理しなければならない可能性が高いためです。また、追加された機能は理由のために追加されました。それらを学習して使用すると、それらに感謝するようになるかもしれません。


あなたは私の文章を不完全に引用しました。私が後の文で言ったように、goodそれは良いプログラミング言語設計の規則に従うことを意味します。どこで勉強するのかわかりませんが、4か5か国を知っており、Cでプログラミングの学習を始めます。Cで言ったように、例外はほとんどありません(Javaで反対のことは、かろうじて例外のない構造を見つけてください)。
シャーバズ

1
@Shahbaz:完全な文章を引用しました。あなたは因果関係を作りました、そして私はそれがせいぜい不完全であると言いました。ありがたいことに、私はもう勉強していません。:)私はそれを十分にやった。私は米国に住んでおり、大学に進学したとき(15年以上前)、Cは入門言語でした。しかし、今日のほとんどの米国の学校では、Javaで始まり、およびCを知っている多くの若いプログラマは存在しない
ディマ

5
@Shahbaz:例外のある言語ルールの問題は本当に見当たりません。はい、CはC ++よりもはるかに単純な言語です。一方、C ++を使用すると、簡単なコードを簡単に記述できます。より簡単なコードを書くには、より多くの言語機能が必要です。それは言語をより複雑にします。私は、クラス、参照、RAII、テンプレート、コンストラクタ、デストラクタ、例外、名前空間などのようなものがあります。しかし、あなたはあなたの質問はC vs C ++に関するものではないと言っていたので、私は答えについてそれについて書きませんでした。
ディマ

5
  • 人々はマシンコードを書くことを好まなかったため、アセンブリが作成されました
  • Cは、人々がアセンブリを書くことを好まなかったために作成されました
  • C ++は、人々がCを書くことを好まなかったために作成されました。
  • C ++ 11が作成されたのは、人々がC ++を書くのが好きではなかったからです

C ++のキャリアの中で、「ファンクターがもっとシンプルになったらいいのに」とか、「なぜNULLはintなのか」と言うところまで来ます。そして、C ++ 11を理解します。


誰かが既存の言語を好まなかったため、すべての言語が作成されました。それはそれらのどれも良くしません。
シャーバズ

私はそうNULLすべきだとは言いませんint。すべきではありません。私が適切とは思わないのは、これを解決する言語の構造を導入することですが、例外を導入することです。彼らは同じことをより良い方法で行うことができたはずです。
シャーバズ

2
「C ++ 11は、C ++の作成が好きではなかったために作成されました」:C ++の作成が気に入らない場合、C ++がC ++ 11のサブセットである理由
ジョルジオ

1
人々はC ++を書くのが好きではなかったので、C#とJavaが作成されたはずです。
カルマリウス

4

学習は常に有益です。知識は力である。

それが基本的な答えです。それ以外はすべて、それからどれだけ正確に利益を得ることができるか、そしてそれを知ることで得られる力についての詳細であり、列挙が不完全であるほどたくさんあります。

1つの例はあなた自身の質問です。少なくとも少し学習しなければ、質問することさえできません。

そして、私がコメントしたように-本当の懸念は学ぶ理由ではなく、使用する理由です。それはまったく別の質問です。


4

追加された機能により、より良いコードを作成できるため、C ++ 11を学習する必要があります。NULLポインターとラムダの型安全性について言及している人もいますが、これらは非常に便利です。しかし、特に大規模な実稼働環境でのC ++ 11の最も劇的な変化であると思うものに注意を向けたいと思います。それは、セマンティクスの移動です。

C ++ 11は、「移動」と「コピー」の別々の概念をサポートしています。通常のC ++では、基本的にこれらの両方を行う=演算子があります。しかし、実際には、1人のオペレーターで2つの異なるアイデアを表現しているため、危険です。

これが役立つ最も明白な例は、新しいunique_ptrです。古いauto_ptrとscoped_ptrの最高の機能をすべて備えています。オブジェクトを指す唯一のポインタであることが保証されているポインタが必要だとします。a = bをどのように扱いますか?さて、前に行き詰まってしまいました(scoped_ptrとして)完全に禁止するか、a = bがbから所有権を奪うところでauto_ptrができることをすることができます。auto_ptrのこの動作は、a = bが実際にbを変更するため、非常に混乱します。unique_ptrはこれを処理します。a= bは許可されませんが、所有権を盗むためにa = std :: move(b)があります。これはどのように役立ちますか?ここで、コピーセマンティクスではなく移動セマンティクスを使用する別の(オーバーロードされた)バージョンのスワップがあります。これは、unique_ptrを問題なく交換できることを意味します。つまり、unique_ptrは、auto_ptrとは異なり、コンテナ内で使用してからソートと言っても安全です。unique_ptrは、基本的にbe allであり、同じオブジェクトに複数のポインターが必要ない場合、すべての安全なメモリ管理を終了します。

別の素晴らしい例:コピーできないオブジェクトがあるとします。これは多くの状況で役立ちます。関数が終了すると、返されるものはすべてコピーされるため、関数からこのオブジェクトを返すことはできません。皮肉なことに、通常、コンパイラは実際にこれを最適化します(つまり、実際には最後に何もコピーされず、最終的な割り当てのアドレスに戻り値が作成されます)。しかし、これはコピー不可にした理由とは何の関係もありません。関数から戻ることは、実際にはオブジェクトを関数のスコープ内から外部に移動するだけです。コピーできないが移動可能なオブジェクトを作成できるようになりました。これらのオブジェクトは関数から返すことができます。

移動セマンティクスを使用すると、リークせず、スレッドセーフなコードを簡単に作成できます。


また、ところで、効率的です。
ニルフリードマン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.