手続き型プログラミングに対するオブジェクト指向プログラミングの利点は何ですか?


77

Cのような手続き型言語とC ++のようなオブジェクト指向言語の違いを理解しようとしています。私はC ++を使用したことはありませんが、2つを区別する方法について友人と話し合ってきました。

C ++には変数を定義するためのパブリックモードとプライベートモードだけでなく、オブジェクト指向の概念もあると言われています。Cにはないものです。Visual Basic.NETでプログラムを開発する際にこれらを使用する必要はありませんでした。これらの利点は何ですか?

また、変数がパブリックであればどこからでもアクセスできると言われましたが、Cのような言語のグローバル変数とどのように異なるのかは明確ではありません。プライベート変数がローカル変数とどのように異なるのかも明確ではありません。

私が聞いたもう一つのことは、セキュリティ上の理由から、関数にアクセスする必要がある場合、最初に関数を継承する必要があるということです。ユースケースは、管理者がすべてではなく必要なだけの権限を持っている必要があることですが、条件付きでもうまくいくようです:

if ( login == "admin") {
    // invoke the function
}

なぜこれが理想的ではないのですか?

オブジェクト指向のすべてを行うための手続き的な方法があるように思えるのに、なぜオブジェクト指向のプログラミングを気にしなければならないのですか?




26
+1を押して、いくつかのダウン票に対抗します。同僚が私にそのような質問をした場合、私はおそらくいくつかの懸念を抱き、彼に反対票を投じることさえあります(彼の隣に何らかの下向き矢印があると仮定して)。ただし、この質問は将来のソフトウェアエンジニアによって尋ねられたようで、投稿する前にトピックを考えて議論するのにしばらく時間を費やしたようです。私は彼を解雇するのではなく助けるのに投票します。
DXM

14
@DXM素晴らしいアイデア!同僚の周りに浮かぶ下向きの矢印/上向きの矢印...それは驚くべきことです。
ヤニス

2
標準的なカウンター引数:Cでできることをすべて行うアセンブラーの方法もあるので、なぜCを気にする必要があるのですか?(ヒント:抽象化のレベルを上げることがすべてです。C++は、Cの速度の大部分を犠牲にすることなくこれを行うことができます
。IMOが

回答:


135

これまでのすべての回答は、「cとc ++の違いは何か」という、あなたの質問のトピックに焦点を当てています。現実には、違いが何であるかを知っているように聞こえますが、なぜその違いが必要なのか理解できません。それで、他の答えはオブジェクト指向とカプセル化を説明しようとしました。

あなたの質問の詳細に基づいて、あなたはいくつかのステップを踏む必要があると思うので、私はさらに別の答えでチャイムインしたかった。

C ++やOOの目的を理解していないのは、アプリケーションがデータを保存するだけでよいように思えるからです。このデータは変数に保存されます。「なぜ変数にアクセスできないようにしたいのでしょうか?今ではもうアクセスできません!すべてを公開するか、より良いがグローバルにすれば、どこからでもデータを読むことができ、問題はありません。」-そして、あなたは正しい、あなたが現在書いているプロジェクトの規模に基づいて、おそらくそれほど多くの問題はありません(または、ありますが、あなたはまだそれらに気付いていません)。

あなたが本当に答える必要のある根本的な質問は、「なぜデータを隠したいのでしょうか?それを行うと、私はそれを扱うことができません!」だと思います。そして、これが理由です:

新しいプロジェクトを開始し、テキストエディターを開き、関数の作成を開始するとします。後で保存するために何かを保存する必要があるたびに、変数を作成します。物事を簡単にするために、変数をグローバルにします。アプリの最初のバージョンは素晴らしい動作をします。さらに機能を追加し始めます。より多くの関数があり、前に保存した特定のデータを新しいコードから読み取る必要があります。他の変数を変更する必要があります。より多くの関数を書き続けます。あなたが気づいたかもしれない(あるいは、そうでない場合、絶対に気づくでしょう)は、コードが大きくなると、次の機能を追加するのに時間がかかります。また、コードが大きくなると、以前は機能していたものを壊さずに機能を追加することがますます難しくなります。どうして?あなたは何を覚えておく必要があるため、すべてをグローバル変数が保存されており、それらのすべてが変更されている場所を覚えておく必要があります。また、どの関数が正確な順序で呼び出しても問題ないことを覚えておく必要があります。異なる順序で呼び出すと、グローバル変数がまだ完全に有効ではないため、エラーが発生する可能性があります。これに遭遇したことがありますか?

典型的なプロジェクト(コード行)の大きさは?現在、プロジェクトの5000〜50000倍の大きさのプロジェクトをイメージングしています。また、複数の人が働いています。チームの全員が、これらすべての変数が何をしているのかをどのように思い出すことができますか(あるいは意識することさえできますか)?

上記で説明したのは、完全に結合されたコードの例です。そして、時間のthe明期(1970年1月1日から始まったと仮定)以来、人間はこれらの問題を回避する方法を模索してきました。それらを回避する方法は、コードをシステム、サブシステム、コンポーネントに分割し、データにアクセスできる関数の数を制限することです。5つの整数とある種の状態を表す文字列がある場合、5つの関数のみが値を設定/取得すれば、この状態で作業しやすくなりますか?または、100個の関数がこれらの同じ値を設定/取得する場合はどうなりますか?OO言語(Cなど)がなくても、人々はデータを他のデータから分離し、コードのさまざまな部分の間に明確な分離境界を作成することに懸命に取り組んできました。プロジェクトが特定のサイズになると、「関数Yから変数Xにアクセスできますか」というプログラミングの容易さがなくなります。

これがオブジェクト指向の概念が導入された理由であり、これがそれらが非常に強力な理由です。データを自分から隠すことができ、意図的にそれをしたいのです。そのデータを見るコードが少ないほど、次の機能を追加するときに何かを壊す可能性が低くなるからです。これは、カプセル化とオブジェクト指向プログラミングの概念の主な目的です。これらを使用すると、システム/サブシステムをさらに細かいボックスに分割し、プロジェクト全体の規模に関係なく、特定の変数セットにアクセスできるのは50〜200行のコードだけであるということです。OOプログラミングには明らかに多くのものがありますが、本質的に、これがC ++がデータ/関数をプライベート、保護、またはパブリックとして宣言するオプションを提供する理由です。

OOで2番目に大きなアイデアは、抽象化レイヤーの概念です。手続き型言語には抽象化もありますが、Cではプログラマーは意識的にそのようなレイヤーを作成する必要がありますが、C ++では、クラスを宣言するときに自動的に抽象化レイヤーを作成します(この抽象化の有無はユーザー次第です)値を追加または削除します)。抽象化レイヤーについて詳しく読んで研究する必要があります。さらに質問がある場合は、このフォーラムでもそれらに答えることができると思います。


5
偉大な答えは、質問を与えられた適切なレベルにヒットするようだ
カルロス

29
+1 ...ほとんどは、のために「と時間の夜明け(時間を想定したが、1970年1月1日に開始)以来...」ライン
CaffGeek

4
@Chad-行だけで少なくとも1ポイント獲得する必要があると考えていました:)
DXM

手続き型のパラダイムで話しているこのスケールの問題に対処する方法があります。関数と呼ばれます。しかし、問題を説明する良い方法です。
annoying_squid

@DXM-答えを正しく理解したかどうかわかりません。手続き型プログラミングでも同じset / get機能を実現できます。グローバル変数を変更/取得するために、Cでset / get関数を作成できます。この方法も使用して、グローバル変数を変更する関数の数を制限しています。また、OOPでも、set / getメソッドを使用する場合、オブジェクトの外部からこれらのメソッドを使用して値を変更します。
カディナ

10

うーん...たぶん、バックアップして、オブジェクト指向プログラミングの基本的な意図を理解しようとするのが最善でしょう。オブジェクト指向プログラミングの目的の多くは、抽象データ型の作成を許可することです。間違いなく使い慣れている本当に簡単な例として、文字列を考えてみましょう。通常、文字列には、文字列の内容を保持するバッファ、文字列を操作できるいくつかの関数(その中の検索、その部分へのアクセス、部分文字列の作成など)があります。文字列の(現在の)長さ、および(おそらく)バッファのサイズを追跡するので、(たとえば)文字列のサイズを1から1000000に増やすと、より大きなメモリを保持するためにより多くのメモリが必要になることがわかりますコンテンツ。

これらの変数(バッファー、現在の長さ、およびバッファーサイズ)は文字列自体に対してプライベートですが、特定の関数に対してローカルではありません。各文字列には特定の長さのコンテンツがあるため、その文字列のコンテンツ/長さを追跡する必要があります。逆に、同じ関数(たとえば、部分文字列を抽出する)は、異なる時間に多くの異なる文字列を操作する可能性があるため、データは個々の関数に対してローカルになりません。

そのため、文字列に対してプライベートなデータになるため、文字列関数からのみ(直接)アクセスできます。外部の世界は、文字列関数を使用して文字列の長さを取得できますが取得するために文字列の内部について何も知る必要はありません。同様に、文字列を変更する場合がありますが、再び、文字列関数を介して変更し、文字列オブジェクトのローカル変数のみを直接変更します。

セキュリティに関する限り、これは類推としては合理的ですが、実際に機能する方法ではないことに注意してください。特に、C ++でのアクセスは、オペレーティングシステムでのアクセスと同じ種類の要件を満たすことを特に意図していません。オペレーティングシステムは制限を実施することになっているので、(たとえば)通常のユーザー管理者のために予約されていることはできません。対照的に、C ++のアクセス制御は、事故を防ぐことのみを目的としています。設計上、誰でも簡単にバイパスできます。ファイルを読み取り専用としてマークする順序と同じなので、誤って削除することはありません。ファイルを削除する場合、読み取り専用から読み取り/書き込みに変更するのは簡単です。すべて読み取り専用にそれをしない設定すると、あなたは、少なくともそれについて秒を考えさせるとで決め、それだけで間違った時に間違ったキーを押すと、事故によって削除され得ることはありませんので、ファイルを削除します。


6

OOP対Cは、実際にあなたが議論したことのどれでもありません。それは、主に、意図せずに(または意図的にさえ)互いに影響を与えない/できない領域にコードをパッケージ化することです。

Cを使用すると、基本的に任意の関数をどこからでも実行できます。OOPは、メソッドをクラスにグループ化し、それらを含むクラスを参照することでのみメソッドを使用できるようにすることで、それを防ぎます。したがって、OOPの潜在的に大きな利点の1つは、あなたがすべきことを伝えるための多くの経験がなくても、より良いコード配置を持つ可能性がはるかに高いことです。


4
-1。Cには、すべての機能をグローバルにする排他的なものはありません。任意の関数を静的に宣言して、そのスコープをローカルファイルに制限できます。Cは、この点でC ++、Javaなどと違いはありません。また、OOPは言語構文に関するものではありません。OOプログラムをCで書くことはできますが、OOの構文をサポートする言語よりも少し粗雑になります。逆に、OOをサポートする言語を選択したからといって、OOPを取得することはできません。オブジェクト指向はプログラミングスタイルであり、言語機能ではありません。

@Lundin:技術的には正しいのですが、ポイントを逃しました。OOP言語では、デフォルトの動作でOOPのように動作します。Cはしません。
ジョンフィッシャー

1
オブジェクト指向言語には、それを強制するものは何もありません。たとえば、言及する価値のあるオブジェクト指向のない無数のC ++プログラムを見てきました。同様に、オブジェクト指向についての手がかりがなく、クラス、遺産などを実装しようとすると、混乱したプログラムを作成する可能性が約100%あります。

@Lundin:C ++は公正な例ではないと思います。(少なくとも)Cプログラムを(多くの)変更なしでコンパイルできることを意味します。クラスを上に追加しても、C#やJavaレベルのOOP言語にはなりませんが、そのような開発は可能です。
ジョンフィッシャー

OO以外のプログラムもJavaで記述できます。1つの巨大なメイン​​ファイルでハックするだけです... OOはまだ言語固有ではありません。

4

よく書かれたクラスは、少し「信頼の島」である必要があります。それを使用して、「正しいこと」を行い、よくある落とし穴からあなたを守ると仮定できます。これにより、優れたクラスがビルディングブロックになります。これは、機能と変数の束としてはるかに再利用可能であり、うまく機能する可能性がありますが、それらのgい内臓をすべて表示し、それらがどのように機能し、初期化する必要があるかを理解するように強制します優れたクラスはUSBプラグのようなものである必要がありますが、手続き型のソリューションはワイヤ、チップ、スズ、はんだビットの束のようなものです。

詳細に説明しなかった1つのポイントは、インターフェイス/実装の側面です。インターフェイスは動作を記述しますが、実現は記述しません。リストインターフェースは概念を説明しますリストとその振る舞い:追加、削除、サイズ変更メソッドなどを期待します。現在、このリストを実装するには、リンクリストとして、または配列バッファを使用するなど、さまざまな方法があります。OOプログラミングの力は、インターフェイスを使用することで、実装を知らなくても動作を推論できることです。内部変数またはメソッドにアクセスするとこの抽象化が破壊され、リストの実装を別のものに置き換えることはできず、クラスを使用してコードに触れることなく既存の実装を改善することはできません。これが、プライベート変数とメソッドが必要な主な理由の1つです。実装の内部の詳細を保護するため、抽象化はそのままです。

OOはさらに一歩進んでいます。たとえば、ライブラリの場合、まだ存在しないものに対してもインターフェイスを定義し、そのインターフェイスで動作するコードを作成できます。ユーザーは、インターフェイスを実装するクラスを記述し、ライブラリが提供するサービスを使用できます。これにより、手続き型プログラミングでは不可能な柔軟性を実現できます。


インターフェイスの概念は、オブジェクト指向言語に固有のものではありません。大きな要因は、非OOP言語では、モジュール内で使用されるほぼすべての関数が同じグローバル名前空間に属している必要があることだと思います。これは、1つのプレフィックスのいずれかの関数名は、彼らが作用、または他の完全に異なることを行う多くの同様な響きの方法を持っているものを示すためにする必要があり(例えばSetLocation移動するために使用されるかもしれないMonsterが、SetPosition移動かもしれないPopupWindow、とMove位置を調整するために使用される可能性がありますのDisplayCursor)。右の「移動」の方法を見つけようと...
supercat

... MyMonstor->エディタを書くときに、タイプの物に適用できるメソッドのリストのみを表示する場合、はるかに簡単にできますMonster。多数の異なる種類があり、それぞれが約12の操作をサポートしている場合、メソッドリストの混乱を90%削減すると、生産性が大幅に低下します。
supercat

@supercat名の衝突は、OOP以外の問題ではなく言語の問題です。一方、コンパイラは基本的に関数の名前を自動的に変更するか、変更する必要があるため、名前空間には問題があります。なぜ手動でそれをしないのですか?
annoying_squid

@annoying_squid:OOPが提供するのは、関数の主な引数のを効果的に使用して名前空間を選択する機能です。私は、変数がある場合はitタイプのをSuperFancyWhizBang、のいずれかの呼び出しSuperFancyWhizBangでのメソッドは、itタイプを書き出す必要はありませんSuperFancyWhizBang。と言うit.woozle()と、コンパイラは自動的にを検索しwoozleますSuperFancyWhizBang
-supercat

3

Turingマシンで、または少なくともCまたはC ++プログラムが最終的にコンパイルされるマシンコードのアセンブリ言語で、すべてを実行する方法があります。

そのため、違いはコードができることではなく、人々ができることです。

人々は間違いを犯します。たくさん。

OOPは、人間のコーディングミスの可能性のあるスペースのサイズと確率密度を減らすのに役立つパラダイムと構文を導入します。データオブジェクトの特定のクラスに対してその間違いを違法にすることによって(そのオブジェクトに対して宣言されたメソッドではないなど)。時々、言語の標準的な使用法と比較して、ミスをより冗長にしたり、スタイル的に奇妙に見えることによって。場合によっては、一貫性のない、または絡み合った使用法(パブリックとプライベート)の可能性がはるかに少ないインターフェイスが必要です。等

プロジェクトが大きいほど、ミスの可能性が高くなります。小さなプログラムでしか経験しなかった場合、新しいコーダーがさらされることはないかもしれません。したがって、OOPが貴重である理由の潜在的な困惑。


2

あなたの質問は、違いではなく、OOPの目的についてのようです。投稿のコンセプトはカプセル化です。CHANGEをサポートするためにカプセル化が存在します。他のクラスが内部にアクセスしている場合、それらを壊さずに変更することは困難になります。OOPでは、他のクラスとのやり取りを許可するインターフェイス(パブリックメンバー)を提供し、内部を非表示にして安全に変更できるようにします。


関数のプロトタイプを使用してください。それがカプセル化です。
annoying_squid

2

どこでプライベート変数を読んでもアクセスできませんが、パブリック変数はアクセスできるので、パブリックをグローバルとして、プライベートをローカルとして、なぜ違いがありますか?パブリックとプライベートの実際の使用は何ですか?誰もが使用できると言ってはいけません、私たちはいくつかの条件を使用して呼び出しを行うのはなぜでしょうか?

アプリケーションに複数の文字列が必要ないことを願っています。また、関数呼び出し間でローカル変数が保持されることを願っています。これらのことは、アクセシビリティの面では同じかもしれませんが、寿命と他の使用法の面では同じですか?それらはまったく同じではありません。


1

多くの人が言ったように、一度プログラムがコンパイルされると、バイナリコードに変換され、バイナリ文字列を使用して整数を表すことができるため、プログラムは最終的には単なる数字になります。しかし、必要な数を定義するのはかなり難しいかもしれません。そのため、高レベルのプログラミング言語が登場しました。プログラミング言語は、最終的に生成されるアセンブリコードの単なるモデルです。コンテキスト指向プログラミングに関するこの非常に素晴らしい論文を使用して、手続き型プログラミングとオブジェクト指向プログラミングの違いを説明したいと思います。http://www.jot.fm/issues/issue_2008_03/article4/

論文に描かれているこの図からわかるように、手続き型プログラミングは、計算ユニットを名前に関連付けるための1つの次元のみを提供します。ここで、プロシージャコールまたは名前は、プロシージャ実装に直接マップされます。図aでは、m1を呼び出すことは選択の余地がなく、プロシージャm1の唯一の実装の呼び出しがあります。

オブジェクト指向プログラミングは、手続き型プログラミングの名前解決に別の次元を追加します。メソッド名またはプロシージャ名に加えて、メッセージのディスパッチでは、メソッドの検索時にメッセージ受信者が考慮されます。図bには、メソッドm1の2つの実装があります。適切なメソッドの選択は、メッセージ名m1だけでなく、実際のメッセージの受信者、ここではRyにも依存します。

これにより、実際にカプセル化とモジュール化が可能になります。

ここに画像の説明を入力してください

最後に、Figure-cは、サブジェクト指向プログラミングがオブジェクト指向メソッドのディスパッチをさらに別の次元で拡張したものです。

これが、OOPを別の視点から考えるのに役立つことを願っています。


0

(+1)よく分からないことを質問するのは、馬鹿げているように聞こえても良いことです。

違いはオブジェクトとクラス指向プログラミングです。「プレーンC」は、データと関数で機能します。「C ++」は、「オブジェクトとクラス」の概念に加えて、いくつかの関連する副次的な概念を追加します。

ただし、「C ++」の前に「Plain C」を習得することを開発者に推奨します。または、「Object Pascal」の前の「Procedural Pascal」。

多くの開発者は、学生は1つだけを教えるべきだと考えています。

たとえば、OOを取得せず、「Plain Structured C」のみを教える古い教師。

または、「必要ない」ので、「プレーンC」ではなく、オブジェクト指向のみを教える「ヒップスター」教師。または両方、教育順序を気にせずに。

むしろ、学生は「構造化プレーンC」と「オブジェクト指向C(C ++)」の両方を教えるべきだと思います。最初は「プレーンC」、後は「C ++」です。

現実の世界では、両方のパラダイム(および「機能的」などの他のパラダイム)を学ぶ必要があります。

構造化されたプログラムを大きなシングルトンの「オブジェクト」と考えると役立つ場合があります。

また、ネームスペース(「モジュール」)を強調する必要があります。両方の言語で、多くの教師はそれを無視しますが、それは重要です。


名前空間とオーバーロードは、プログラムの理解を難しくするだけです。これにより、識別プロセスのコンテキストが区別されます。あなたが表示されたらfoo()C ++で、それはグローバル関数、現在のネームスペース、あなたが使用した名前空間内の関数で機能することができusing、メソッド、継承されたメソッドと、それは関数呼び出しでいた場合:それは、その名前空間にすることができ引数ベースの名前検索によって解決できます。同様のことがJavaとC#にも当てはまります。Cでは、現在のソースファイルの静的関数、またはヘッダーの静的関数のみを使用できます。
カルマリウス

どこにでもMODULE_Foo()を書くことは視覚的に煩雑になるかもしれませんが、少なくともどの関数であるかは正確に知っています。
カルマリウス

@Calmariusの解決策は、明らかにfooという名前を付けないことです。

0

一言で言えば、プロジェクト管理。つまり、C ++を使用すると、他の人が自分のコードをどのように使用するかのルールを強制することができます。550万行のプロジェクトに取り組んでいると、オブジェクト指向プログラミングが非常に役立ちます。別の利点は、私(および他のすべての人)が特定の規則に従い、コンパイル時に小さなエラーをキャッチするコンパイラです。理論上の利点もすべてありますが、日常の実用的なことに集中したかっただけです。結局それはすべてマシンコードにコンパイルされます。


-1

オブジェクト指向プログラミングは、ボックスを備えた手続き型プログラミングです。

PPでは、1つのボックス、1つの状態があり、プロジェクトが大きくなると信じられないほど大きくなり、その大きな状態のほんの一部を忘れるたびに副作用が現れます。

オブジェクト指向では、多くのボックス、多くの状態があり、プロジェクトが成長するにつれて、ボックスが少し大きくなり、ボックスの数が大きくなります。

小さいボックスを見るのは簡単で、全体像のように錯覚させるのは簡単ですが、クラスとインターフェースを見ると重要な影響を与える可能性のある実装の詳細が隠されるため、実際にはほとんど不可能です。

関数型プログラミングでは、多くの関数ボックスがあり、すべての関数に1つのエントリ(パラメーター)と1つの出口(リターン)があり、厳密には外部コンテキストへの他のアクセスはないと決定します。

(設計上)状態も副作用もないため、関数を全体とは別に安全に分析し、どのような状況でもどのように動作するかを100%知ることができます。

アクションを表す論理単位でコードをボックス化するため、通常のアクションごとに1つのボックスのみを持つことも可能になります。

これにより、さまざまなクラスのコードベース全体に複数のアナログ関数を非表示にするOOPと比較して、大規模プロジェクトのコードが大幅に縮小されます。

これは、追跡するXXXXXXXL状態がなくなるため、プロジェクトをより長く成長させることができるため、PPをはるかに上回ります。

要約すると、PPはおそらく単純なプログラムにアプローチする最も簡単な方法であり、FPはおそらく複雑なプログラムにアプローチする最も単純な方法です。

すべてのコードベースを統合し、コードの再利用性を向上させるという目標を考慮する場合、FPは非常に大規模な意味を持つ唯一のパラダイムであり、100%の再利用性を持つ唯一のパラダイムであるため、FPを常に使用する必要があります関数を単にコピーして貼り付け、オーバーヘッドなしで他の場所で使用します)。

また、100%信頼性の高い単体テストを無料で取得できます。

そして、「private static final of_doom genius awesome string_1」と書く必要はありません。

そして、あなたは無料で並列処理を取得します。


-3

単純な1文の違いは、C ++がクラスを持つCであるということです(現在ははるかに多くなっていますが)。この記事はあなたを大いに助けます:-C ++(Wikipedia)

また、問題のグーグル検索が役立ちます。ランダムな人にこれを説明してもらうのは難しいかもしれません。私見、誰かに尋ねるよりも読んで理解する方が良い


私はそれらを読みましたが、彼らは彼らがどこで使われるかを言っただけで、それでも私の質問を解決しませんでした。
ニコ

私は私がググどんな力を入れずに質問をしていなかったが、違いを理解することはまだできないので、私はこれらを手伝ってstackoverflowのに会った
ニコ

1
@niko、ここで私を間違えています。私が意味したのは、本を読んで両者の違いを理解しようとすることでした。友達に尋ねるのは良くありません。彼らはあなたを満足させないかもしれない彼ら自身の理解を提供するからです。しかし、心配しないでください。ここには素晴らしい仲間がいます。彼らはきっとあなたを助けてくれます:-)
パンカジウパディエイ

2
私はダウン投票しませんでしたが、「C ++はクラスを持つC」にひどく誘惑されました。実際にC ++を実行できる私たちは、人々の頭からそれを取り除こうとすることで私たちの問題を解決します。
DeadMG

1
@パンカジ:そうです。それはだったクラスとC。それはもはや間違いなくクラスを持つCではなく、そのように呼ぶのは30年近くも古いです。それ以来、C ++は非常に長い道のりを歩んできました。C ++をコーディングする人は、今では決してそのように言及することはありません。それは最悪の習慣と間違った印象を助長します。
DeadMG
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.