「C++/C++特有の概念」の版間の差分
削除された内容 追加された内容
→オブジェクト指向との関連: cout << "abc" は、 cout.operator<<("abc") ではなく operator<<(cout, "abc") タグ: 2017年版ソースエディター |
タグ: 2017年版ソースエディター |
||
128 行
例えば、Cでは標準出力に出力する時には次のようにprintf関数を使いました。
:<syntaxhighlight lang="C">
printf("abc");
</syntaxhighlight>
134 行
一方、ファイルに出力する時には次のようにfprintfという異なる関数を使う必要があります。
</syntaxhighlight>
<syntaxhighlight lang="C">
printf("abc");
▲fprintf(f, "abc"); // fはファイルポインタ
</syntaxhighlight>
:は
<syntaxhighlight lang="C">
fprintf(stdout, "abc");
▲出力する対象の数が増えて来るとわかりづらくなります。
</syntaxhighlight>
:と等価で、他にも sprintf() などもあり、手続き型言語なりの派生体系が作られています。
</ref>。
一方、C++を用いると、標準出力に対しては、
:<syntaxhighlight lang="cpp">
std::cout
</syntaxhighlight>
ファイルに対しても、
:<syntaxhighlight lang="cpp">
</syntaxhighlight>
となり、同じ名前の関数 <nowiki> operator<< </nowiki> を用いることが出来ます。
ここで、<nowiki> operator<< </nowiki> は、それが所属するオブジェクト(実際にはオブジェクトが所属するクラス)によって動作が変化していることに注意が必要です。
このように、データ自身が実際の動作を知っていることで、様々なデータを統一的に扱うことが出来ます。
もちろん、オブジェクト自身を設計する時には、データを統一的に扱えるようにクラスを設計する必要があるため、Cの例の場合より必ずしも仕事が簡単になる訳ではありません。
しかし、これらを使う側に取っては、C++の例の場合の方が分かりやすいといえるでしょう。
==== 演算子のオーバーロード ====
C++では、演算子のオーバーロードによって定義型に演算子を追加することができます。
:<syntaxhighlight lang="cpp">
cout << "abc";
</syntaxhighlight>
:は
:<syntaxhighlight lang="cpp">
▲<syntaxhighlight lang="cpp">
operator<<(cout, "abc");
</syntaxhighlight>
演算子のオーバーロードは、「新しい数値型」を定義する場合などでは素晴らしい効果を発揮しますが、ファイルストリームにシフト演算子を適用するようなケースは「予め了解された体系」ではないので賛否両論があります。
▲という演算子の関数呼び出しが実行されます。
== オブジェクト指向 ==
|