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

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