第1章 第1節 最初はやっぱり"Hello, world!"


← 前に戻る | 次に進む →

それではまず、下のプログラムを見てください。これは画面に"Hello, world!"と表示するプログラムです。

List 1.1 画面に"Hello, world!"と表示するプログラム

#include <iostream>

int main()
{
    std::cout << "Hello, world!" << std::endl;

    return 0;
}


Hello, world!

では、最初から見ていきましょう。

まず、最初の行で、#include <iostream>とありますが、ここで、"iostream"という名前のヘッダファイルを読み込んでいます。これを読み込むことで画面に対して入出力を行う標準ライブラリ、ストリームI/Oを使用することができます。あと、注意していただきたいのが、これは決して"iostream.h"の間違いではないということです。ですから勝手に".h"を付けないでくださいね。実は、".h"の付いた名前のヘッダも使えるのですが、ちょっと意味が異なってくるのです。これに関しては次の名前空間に関連して説明します。

次にint main()という行が出てきますが、これはC++で最初に実行される関数であるmain関数になります。C++のプログラムはすべてこのmain関数が最初に実行されます[注1]。頭のintは整数型の値を返すという意味で、関数を抜けるときに(つまりmain関数ではプログラムが終了するときに)整数型の値をreturnで返すことになります。

さて、この後に出てくるstd::cout << "Hello, world!" << std::endl;がこの節でのメインとなります。<<は出力演算子と呼ばれcoutに対して使うことにより、画面に文字を出力することができます。つまり、ここでは"Hello, world!"を画面に出力しろということになります。そして、最後のendlは、ここでこの行は改行して終わりという意味になります[注2]。これで、無事"Hello, world!"と表示することができました。

そして最後のreturn 0;ですが、これは値0をプログラムの終了時に返しています。因みに、この0を返すのはプログラムが正常に終了したという意味になります。

int main()とvoid main()

これはよく議論されることなのですが、main関数の戻り値の型はintとすべきか、voidとすべきか…? もちろんこれはintにすべきです。というのもC++の規格(Cも同様)でvoidは環境依存だとはっきりと決められているからです。つまり、ある環境では動作するが、別の環境では正常に動作しないということが起こるということです。それに対してintはどの環境でも正常に動作することが保証されています。使用する環境がvoidを認めていればその環境では問題がありませんが、互換性はintに比べて確実に低くなるわけです。

でも、別にmain関数の戻り値を使うわけでもないし、そのためにreturn 0;とするのが気に入らないというのであれば、

main()
{
    // 何らかの処理
}

とするとよいでしょう。main関数の戻り値の型を省略した場合、int型になることは決められており、またreturnによる戻り値を省略した場合、不定値が返されることも保証されています。

余談ですが、int main()を使っているか、void main()を使っているかで、C/C++のテキストの良し悪しの簡易判定基準にできます。

あれ、でもちょっと待って! coutendlの頭になにかへんてこなものが付いているよ! std::って何? と思われた方、よく気が付きましたね。実は、これが名前空間(namespace)というものなのです。そしてstdは、標準ライブラリの名前空間になります。因みに、名前空間を指定するには以下のようにします。

List 1.2 名前空間(namespace)にfooを指定する

namespace foo {
    int x, y;
}

これで、fooという名前の名前空間を指定したことになります。でも、何でこんな面倒くさいことしなくちゃならないんだ? と思われるかもしれません。では次に下の例を見てください。

List 1.3 名前空間にfooとbarを指定してそれを使うには…?

namespace foo {
    int x, y;
}

namespace bar {
    int x, y;
}

int main()
{
    foo::x = 10;
    foo::y = 20;
    bar::x = 100;
    bar::y = 200;

    return 0;
}

この例では、fooという名前空間のxとy、barという名前空間のxとyを同時に指定できることがわかります。これだったら、初めからfoo_xとかbar_xとかにすればいいじゃんと思ったあなた、いつもそううまく行くとは限らないのです。もし、誰かが既にxとかyとかをヘッダファイルに定義していたときに、別のヘッダファイルにもxとyが定義されてあると困るでしょう。そんなときに、それぞれ名前空間を使っていれば円満解決です。

でもこれだと、同じ名前の変数や関数などを使っていないときまで、いちいちfoo::だのbar::だのstd::だのを書かなきゃいけないのは面倒だよ! と皆さんは言われるでしょう。しかし、安心してください。標準ライブラリなどの、ある決まった名前空間しか扱わない場合なら、先頭にusing namespace 名前空間;と入れるだけで後に出てくる変数や関数はすべて名前空間を省略できるのです。

ではList 1.1using namespace std;を使って、書き直してみましょう。

List 1.4 画面に"Hello, world!"と表示するプログラム(using namespace版)

#include <iostream>
using namespace std;

int main()
{
    cout << "Hello, world!" << endl;

    return 0;
}


Hello, world!

はい、これですっきりしましたね。この名前空間の説明は少し難しく感じるかもしれませんが、大変重要な考え方なので最初にしっかり覚えておきましょう。これを理解していないと標準ライブラリすら使うことができないのですから。

実は、このページの最初の方でも出てきましたが、標準ライブラリで".h"が付くヘッダファイルはこの名前空間が指定されていません。つまり、#include <iostream.h>とインクルードされている場合には、名前空間の指定がいらなくなります。しかし、ライブラリの再利用など、今後のことを考えれば名前空間を使った標準ライブラリを使うことを強くお勧めします。因みに、C言語で使用されるstdio.hstdlib.hは、C++ではcstdiocstdlibのようになり、stdの名前空間に包まれることになります。


← 前に戻る | 次に進む →


Copyright (C) Noriyuki Futatsugi/Foota Software, Japan.
All rights reserved.
d2VibWFzdGVyQGZ1dGF0c3VnaS5uZXQ=