タグ付けされた質問 「c++」

静的に型付けされた自由形式のマルチパラダイムでコンパイルされた汎用プログラミング言語であるC ++に関する質問。

6
C ++のインライン関数。ポイントは何ですか?
私が読んだことによると、コンパイラーはインライン関数の関数呼び出しをその本体で置き換える義務はありませんが、可能であれば置き換えます。これは私に考えさせられました-それが事実である場合、なぜ私たちはインラインワードを持っていますか?デフォルトですべての関数をインライン関数にして、呼び出しを関数本体で置き換えることができるかどうかをコンパイラーに判断させてみませんか?


7
コーディングスタイルの問題:パラメーターを受け取り、それを変更し、そのパラメーターを返す関数が必要ですか?
私は友人と、これらの2つの慣習が単に同じコインの両面であるのか、それとも本当に優れているのかについて、少し議論しています。 パラメーターを受け取り、そのメンバーに入力してから返す関数があります。 Item predictPrice(Item item) 渡されたのと同じオブジェクトで機能するため、アイテムを返す必要はないと考えています。実際、発信者の観点から見ると、もしそうでない場合は、新しいアイテムを返すと期待できるので、問題を混乱させます。 彼はそれが違いを生まないと主張し、それが新しいアイテムを作成してそれを返すかどうかさえ問題ではないだろうと主張する。次の理由から、私は強く反対します。 アイテムパス(またはポインターなど)への複数の参照がある場合、新しいオブジェクトを割り当てて返すことは、それらの参照が正しくないため、重要です。 非メモリ管理言語では、新しいインスタンスを割り当てる関数はメモリの所有権を要求するため、ある時点で呼び出されるクリーンアップメソッドを実装する必要があります。 ヒープへの割り当ては潜在的にコストがかかるため、呼び出された関数がそれを行うかどうかが重要です。 したがって、オブジェクトを変更するか、新しいオブジェクトを割り当てるかは、メソッドシグネチャを介して確認できることが非常に重要であると考えています。結果として、関数は渡されたオブジェクトを変更するだけなので、署名は次のようになっているはずです。 void predictPrice(Item item) すべてのコードベース(私たちが取り組んでいる言語であるJavaではなく、明らかにCおよびC ++コードベース)で、上記のスタイルは本質的にかなり経験豊富なプログラマーによって守られ、守られています。彼は、私のコードベースと同僚のサンプルサイズは、考えられるすべてのコードベースと同僚のなかで小さいため、私の経験は優れているかどうかの真の指標ではないと主張しています。 それで、何か考えは?

4
C / C ++の関数呼び出しのスタックフレームを理解していますか?
スタックフレームがどのように構築され、どの変数(パラメーター)がどの順序でスタックにプッシュされるかを理解しようとしていますか?一部の検索結果は、C / C ++コンパイラが関数内で実行された操作に基づいて決定することを示しました。たとえば、関数が渡されたint値を1だけインクリメントし(++演算子に類似)、それを返すことになっている場合、関数のすべてのパラメーターとローカル変数をレジスターに入れます。 どのレジスタが戻り値または値渡しパラメータに使用されるのか疑問に思っています。参照はどのように返されますか?コンパイラーはeax、ebx、ecx、edxをどのように選択しますか? 関数呼び出し中にレジスター、スタック、およびヒープ参照がどのように使用、構築、および破棄されるかを理解するには、何を知る必要がありますか?
19 c++  c  compiler  stack 

8
友達にC ++
私は今学期に大学でc ++コースを使用したオブジェクト指向プログラミングを行っており、友人の機能について学習していました。 カプセル化とデータの隠蔽が提供するセキュリティをバイパスする能力があるため、私は彼らを本能的に嫌い、インターネット上のいくつかの記事を読み、一部の人々はそれがいくつかの合法的な使用で良いアイデアだと思いました。 OOPの専門家は、C ++のフレンド機能について何と言いますか?ざっと目を通すだけですか、それとももっと学ぶ必要がありますか?

8
最初のエラーの後、CまたはC ++のコンパイルエラーを読みますか?
CおよびC ++コンパイラがエラーから回復して解析を続行しようとする理由を理解できませんでした。ほとんどの場合、最初のエラーは偽のエラーのストリームを生成し、最初のエラーが修正されるとすぐに消えます。数年の経験の後、私はすべてのファイルの最初のエラー以外のエラーを見ることを止めました。コンパイラを再実行し、エラーがなくなるまでもう一度実行します。それは一般的な習慣ですか?

7
慣用句とは何ですか?
「イディオム」は、特定の言語では整数インクリメントなどのコア言語構文によって単純化されない一般的な操作またはパターンであると理解しています。 i = i + 1; C ++では、このイディオムは演算子によって簡素化されます。 ++i; しかし、誰かが「イディオマティック」という用語を使用するとき、どのようにそれを理解するかわかりません。コードの一部を「イディオマティック」にするものは何ですか?
19 c++  idioms 

7
.cppファイルのみを含めるとすべてが機能するのに、なぜ.hを含める必要があるのですか?
ファイルを含めるだけで機能させることができるのに、なぜファイル.hと.cppファイルの両方を含める必要があるの.cppですか? 例:file.h包含宣言を作成し、次にfile.cpp包含定義を作成し、両方を包含しmain.cppます。 または、file.cppを含む包含宣言/定義(プロトタイプなし)を作成しmain.cppます。 両方とも私のために働く。違いがわかりません。コンパイルとリンクのプロセスに関する何らかの洞察が役立つかもしれません。
18 c++  c  headers  linking  include 

2
Cが人気のTIOBEインデックスでそれほど高いのに、なぜC ++もすぐ下にあるのに、それほど人気が​​ないのですか?[閉まっている]
現在のところ、この質問はQ&A形式には適していません。回答は、事実、参考文献、または専門知識によってサポートされると予想されますが、この質問は、議論、議論、世論調査、または広範な議論を求める可能性があります。この質問を改善し、おそらく再開できると思われる場合は、ヘルプセンターをご覧ください。 6年前に閉鎖されました。 これを回避することはできません。Cがそれほど使用されているが、CはC ++ではない場合、CをC ++よりも使用する最も重要な理由を誰かが説明できますか?このCコードはすべてどこで書かれていますか? これは、命令型プログラミングに大きく依存しているが、C ++コンパイラの実装または調整のコストをサポートできない産業部門に関するものですか?多くのカーネルハッカーがいますか? チオベは関連していますか?私は決して記事につまずかず、単一のTiobeのランキングがどのようになっているのか、業界の本当のニーズを特定するために、業界が好きなものについて実際に何を言っているのか、業界が実際に何を使用しているのかをコメントしたり説明したりしませんでした。説明するのは難しいです。 多くの企業が、C / C ++の仕事がくだらないとしても、CまたはC ++の仕事ではなく、C#、PHP、Javaの仕事を望んでいるのは奇妙だと思います(失業とインタビューをここで関連付けているだけです)。代わりにそれらを取るでしょう。または、これは言語の誇大宣伝がここで強力な役割を果たすことを意味しますか?

8
なぜ本は「コンパイラがメモリ内の変数にスペースを割り当てる」と言っているのですか?
なぜ本は「コンパイラがメモリ内の変数にスペースを割り当てる」と言うのでしょうか。それを実行する実行可能ファイルではありませんか?たとえば、次のプログラムを書くと、 #include <iostream> using namespace std; int main() { int foo; return 0; } コンパイルし、実行可能ファイル(program.exeにします)を取得します。program.exeを実行すると、この実行可能ファイル自体が変数fooにスペースを割り当てるようにコマンドを実行します。しませんか?本が「コンパイラがこれを行う...そうする」と言い続ける理由を説明してください。
18 c++ 

5
状態のないインスタンス化可能なクラスが非常に多いのはなぜですか?
C ++とJavaの世界には、状態のないインスタンス化可能なクラスがたくさんあります。 私は本当に人々がそれをする理由を理解することはできません。C++の無料の関数で名前空間を使用するか、Javaのプライベートコンストラクタと静的メソッドのみを持つクラスを使用できます。 私が考えることができる唯一の利点は、後で特定の状況で異なる実装が必要だと判断した場合、ほとんどのコードを変更する必要がないことです。しかし、それは時期尚早な設計の場合ではありませんか?それが適切になった場合に/後でクラスに変えることができます。 これは間違っていますか?すべてをオブジェクト(つまり、インスタンス化されたクラス)に入れないと、OOPになりませんか?それでは、なぜC ++とJavaの標準ライブラリに非常に多くのユーティリティ名前空間とクラスがあるのですか? 更新: これまでの仕事で確かに多くの例を見てきましたが、オープンソースの例を見つけるのに苦労しています。それでも、私は人々がなぜそれをするのか、それがどれほど一般的であるのか疑問に思っています。

3
C ++の矢印演算子が単なる*。のエイリアスではないのはなぜですか?
c ++では、反復子などで*演算子をオーバーロードできますが、矢印(->)(。*)演算子は*演算子をオーバーロードするクラスでは機能しません。プリプロセッサは->のすべてのインスタンスを(* left).rightに簡単に置き換えることができ、それによりイテレータの実装が改善されると思います。->が異なる実用的な理由はありますか、それとも言語/デザイナーの特殊性ですか?
18 c++  operators 

8
CとC ++の間に言語はありますか?
私はCのシンプルで透明な性質が本当に好きです。Cコードを書くとき、「漏れやすい抽象化」に邪魔されずに、ほとんど常に、作成しているアセンブリに関して巧妙な推測をすることができます。また、Cのシンプルで使い慣れた構文も気に入っています。 ただし、Cにはクラス、簡素化された非cstring処理などのようなC ++が提供するこれらの単純で有用なdoodadがありません。ジャンプテーブルなどを使用してCで実装することはすべて可能ですが、さまざまな理由でタイプセーフではありません。 しかし、私はC ++のオブジェクトを過度に強調することを好むわけではありません。また、「新しい」演算子などに照れ気味です。C ++には、たとえば、システムプログラミング言語として使用するには、ちょっとした問題がいくつかあるようです。 ウィジェットとdoodadsの規模でCとC ++の間に位置する言語はありますか? 免責事項:これは純粋に事実に基づく質問です。C {、++}は私が計画していることを何でもするのに十分であるというあなたの見解を共有しないので、私はあなたを怒らせるつもりはありません。
18 c++  c 

3
左から右への言語構文の利点
私はChannel9 でハーブサッターとのインタビューを見ていましたが、彼はビデオの最後で、左から右への言語構文が将来のC ++標準のウィッシュリストの一番上にあると述べました(彼はそのようにC ++を変更することを認めていますがまったく別の獣になります)。 の他に: 人間がより理解しやすく、肉眼で明確 //C syntax /*pointer to function taking a pointer to function(which takes 2 integers as arguments and returns an int), and an int as arguments and returning an int*/ int (*fp)(int (*ff)(int x, int y), int b) //Go analogous syntax which is left to write …

10
なぜ継承とポリモーフィズムがそれほど広く使用されているのですか?
関数型プログラミングなどのさまざまなプログラミングパラダイムについて学べば学ぶほど、継承やポリモーフィズムなどのOOPコンセプトの知恵に疑問を持ち始めます。私は最初に学校での継承とポリモーフィズムについて学びましたが、当時、ポリモーフィズムは簡単な拡張性を可能にする汎用コードを書く素晴らしい方法のように思えました。 しかし、カモタイピング(動的および静的の両方)および高次関数などの機能的特徴に直面して、継承とポリモーフィズムを、オブジェクト間の脆弱な一連の関係に基づいて不必要な制限を課すように見始めました。多態性の背後にある一般的な考え方は、関数を一度書くだけで、後で元の関数を変更せずにプログラムに新しい機能を追加できるということです。必要なメソッドを実装する別の派生クラスを作成するだけです。 しかし、これは、Pythonのような動的言語であろうと、C ++のような静的言語であろうと、アヒルの型付けによって達成するのがはるかに簡単です。 例として、次のPython関数とそれに続く静的なC ++の機能を考えてみましょう。 def foo(obj): obj.doSomething() template <class Obj> void foo(Obj& obj) { obj.doSomething(); } OOPに相当するものは、次のJavaコードのようなものです。 public void foo(DoSomethingable obj) { obj.doSomething(); } もちろん、大きな違いは、Javaバージョンが機能する前に、インターフェイスまたは継承階層を作成する必要があることです。したがって、Javaバージョンはより多くの作業を必要とし、柔軟性が低くなります。さらに、ほとんどの実際の継承階層はやや不安定であることがわかりました。シェイプとアニマルの不自然な例を見てきましたが、現実の世界では、ビジネス要件の変更と新しい機能の追加に伴い、「is-a」関係を実際に伸ばす前に作業を完了することは困難です。サブクラス、または階層をリモデリング/リファクタリングして、新しい要件に対応するために、さらに基本クラスまたはインターフェイスを追加します。アヒルのタイピングでは、モデリングのことを心配する必要はありません- 必要な機能を心配するだけです。 しかし、継承とポリモーフィズムは非常に人気があるため、拡張性とコードの再利用のための支配的な戦略と呼ぶのは誇張ではないでしょうか。それでは、なぜ継承とポリモーフィズムはそれほど成功しているのでしょうか?継承/ポリモーフィズムがアヒルのタイピングよりも優れているいくつかの重大な利点を見落としていますか?

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