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

削除された内容 追加された内容
C++ 2017年7月17日 (月) 16:40‎ から前書き説明を、こちらに移動。
C++/はじめに 2017年1月5日 (木) 13:59 の版から、C言語とC++の比較の解説を引用。こちらに移動する。
32 行
 
== CとC++の相違点 ==
=== 要点 ===
# Cでは引数がない関数の関数原型の引数のリストにはvoidを指定する。一方、C++ではvoidの指定を省略できる。
# Cでは関数原型の記述は推奨されるが任意である。一方、C++では必ず記述しなければならない。
45 ⟶ 46行目:
より改善された方法があるため、
学習する必要はあまりありません。
 
 
=== Hello, World!を実行する ===
はじめてソースコードを書くときは、
まず「hello, world」プログラムと呼ばれる
画面に「hello, world(改行)」とだけ表示するプログラムを、
書くことにしましょう。
 
C++はCを拡張して作られているため、
Cと似た部分が多くあります。
例えば、次のCで書かれたプログラムはC++でも正しいプログラムです。
このプログラムの解説は[[C言語/はじめに#Hello, World!を実行する]]を参照してください。
 
<source lang="c">
#include <stdio.h>
 
int main(void)
{
printf("hello, world\n");
return 0;
}
</source>
 
しかし、C++では、一部機能が追加されて、また入出力はより直観的な方法で書き直されます。
以下は同じ内容をC++の機能を用いて書き直したものです。
 
<source lang="cpp">
#include <iostream>
using namespace std;
 
int main()
{
cout<<"hello, world"<<endl;
return 0;
}
</source>
 
ここではこのソースコードについて簡単に説明します。
 
* 1行目は、新しいスタイルのヘッダです。<br>Cでは「#include <stdio.h>」のようにファイル名を指定しましたが、これは古いスタイルのヘッダで、C++では新しいスタイルのヘッダを使い、標準識別子を指定します。新しいスタイルのヘッダは、ファイル名ではないので「.h」拡張子がありません。古いスタイルのヘッダは、まだ使用できますが、推奨されません。標準Cヘッダを新しいスタイルで書くと、接頭辞にcが付きます。例えば、「#include <stdio.h>」は「#include <cstdio>」となります。
 
* 2行目は、std名前空間を可視状態にしています。<br>C++の新しいスタイルのヘッダをインクルードすると、その内容がstd名前空間に追加されます。名前空間とは、要素の名前が衝突しても識別できるように、名前の集合に対して与えられる識別名のことです。<ref>[http://e-words.jp/w/%E5%90%8D%E5%89%8D%E7%A9%BA%E9%96%93.html 名前空間とは|namespace|ネームスペース|NS - 意味/定義 : IT用語辞典]</ref>
 
* 3行目は、任意の空白行です。
 
* 4行目から8行目は、main関数の定義です。
 
* 5行目から8行目は、ブロックというまとまりです。
 
* 6行目は、出力演算子による出力操作です。<br>Cではコンソール出力に、printf関数を用いましたが、C++では「<<出力演算子」を使って、改善された方法で出力を行うことができます。Cでは「<<」は左シフト演算子でしたが、C++ではその機能に加えて、出力演算子として用いることができます。これは後で解説する演算子のオーバーロードの例でもあります。
 
* 7行目は、return文です。
 
* 6と7行目が、タブ入力により他の行より右から始まるのは、字下げです。
 
=== オブジェクト指向との関連 ===
クラスを用いたプログラムをオブジェクト指向プログラムと呼びます。
そのため、上のC++のhello, worldの例はオブジェクト指向プログラムの例です。
この例で用いられているオブジェクト指向について簡単にまとめます。
 
この例では、オブジェクト指向を導入した結果として、
<pre>
"hello, world"という文字列をprintfする
</pre>
という考えから、
<pre>
coutと呼ばれるデータに"hello, world"という文字列を与えて、cout自身にそれを解釈させる
</pre>
という考えへの移行が行われています。
 
ここで、coutのようにある演算に対してどう振る舞えばよいか知っているデータのことを、'''オブジェクト'''と呼びます。
上の例では、coutと呼ばれるオブジェクトに対して、定義された演算<<を用いました。
この例は短いのでわかり辛いのですが、
cout自身が文字列の扱い方を知っていることはプログラムを簡単にします。
 
例えば、Cでは標準出力に出力する時には次のようにprintf関数を使いました。
<source lang="c">
printf("abc");
</source>
一方、ファイルに出力する時には次のようにfprintfという異なる関数を使う必要があります。
<source lang="c">
fprintf(f,"abc");//fはファイルポインタ
</source>
これは、扱う対象が異なっている以上当然ですが、
出力する対象の数が増えて来るとわかりづらくなります。
 
一方、C++を用いると、標準出力に対しては、
<source lang="cpp">
std::cout.operator<<("abc");
</source>
ファイルに対しても、
<source lang="cpp">
f.operator<<("abc");//fはファイルストリーム
</source>
となり、同じ名前の関数operator<<を用いることが出来ます。
 
ここで、operator<<は、それが所属するオブジェクト(実際にはオブジェクトが所属するクラス)によって動作が変化していることに注意が必要です。
このように、データ自身が実際の動作を知っていることで、
様々なデータを統一的に扱うことが出来ます。
 
もちろん、オブジェクト自身を設計する時には、
データを統一的に扱えるようにクラスを設計する必要があるため、
Cの例の場合より必ずしも仕事が簡単になる訳ではありません。
しかし、これらを使う側に取っては、C++の例の場合の方が分かりやすいといえるでしょう。
 
* 注意
実際に<<演算子を用いた演算を行う時には、
<source lang="cpp">
cout << "abc";
</source>
の部分は、
<source lang="cpp">
cout.operator<<("abc");
</source>
というメソッドの呼び出しに書き換えられて実行されます。
上の説明ではこのことを前提としています。
 
 
 
== オブジェクト指向 ==