「C++/C++特有の概念」の版間の差分

削除された内容 追加された内容
Ef3 (トーク | 投稿記録)
タグ: 2017年版ソースエディター
Ef3 (トーク | 投稿記録)
→‎オブジェクト指向との関連: operator<< は cout のメンバー関数であるとの誤解に基づいている部分を修正。
タグ: 2017年版ソースエディター
103 行
 
=== オブジェクト指向との関連 ===
クラスを用いたプログラムをオブジェクト指向プログラムと呼びます<ref>オブジェクト指向プログラミングには、クラスを用いずプロトタイプを用いる別の手法もあります。</ref>
そのため、上のC++のhello, worldの例はオブジェクト指向プログラムの例です。
この例で用いられているオブジェクト指向について簡単にまとめます。
110 行
 
<pre>
関数printfを、文字列 "hello, world"という文字列 printf引数として呼出
</pre>
 
116 行
 
<pre>
coutと呼ばれるデータ 、文字列 "hello, world"という文字列を与えて、cout自身にそれ 解釈させ
</pre>
 
という考えへの移行が行われています。
 
こで、coutようにある演算に対してどう振る舞えばよいか知っているデ cout はストリム操作を抽象化したもですが、の様な抽象化された実体'''オブジェクト'''と呼びます。
上の例では、coutと呼ばれるオブジェクトに対して、定義された演算<<を用いました。
この例は短いのでわかり辛いのですが、
cout自身が文字列の扱い方を知っていることはプログラムを簡単にします。
 
例えば、Cでは標準出力に出力する時には次のようにprintf関数を使いました。
 
135 ⟶ 131行目:
 
:<syntaxhighlight lang="C">
fprintf(f, "abc"); // fはFILEへのポインタ
</syntaxhighlight>
 
147 ⟶ 143行目:
</syntaxhighlight>
:と等価で、他にも sprintf() などもあり、手続き型言語なりの派生体系が作られています。
:そもそも型FILEは、内部構造の隠蔽が図られている考えられています。
</ref>。
 
161 ⟶ 158行目:
となり、同じ名前の関数 <nowiki> operator<< </nowiki> を用いることが出来ます。
 
ここで、<nowiki> operator<< </nowiki> は、それが所属する引数のオブジェクト(実際にはオブジェクトが所属するクラス)によって動作が変化していることに注意要です。
このように、データ自身演算子を含む関数実際オブジェクト動作を知種類によって振舞を変えることで、様々なデータに対する操作を統一的に扱うことが出来ます。
 
もちろん、オブジェクト自身を設計する時には、データを統一的に扱えるようにクラスを設計する必要があるため、Cの例の場合より必ずしも仕事が簡単になる訳ではありません。
しかし、これらを使う側に取っては、C++の例の場合の方が分かりやすいといえるでしょう。
 
==== 演算子のオーバーロード ====
177 ⟶ 171行目:
operator<<(cout, "abc");
</syntaxhighlight>
という関数呼出しと等価です(実際に動くコードです)
 
演算子のオーバーロードは、「新しい数値型」を定義する場合などでは素晴らしい効果を発揮しますが、ファイルストリームにシフト演算子を適用するようなケースは「予め了解された体系」ではないので賛否両論があります。