C++らしい書き方と機能

入出力方法(ストリーム)

文字の出力はprintf、入力はfgetc、scanfなどを説明しましたがこれは伝統的なCの書き方です。C++では更に違った書き方が出来ます。

プロジェクト名: stream1

#include<iostream>

int main()
{
    std::cout << "文字を表示" << std::endl;
    char a;
    std::cin >> a;
    return 0;
}

このプログラム終了するときは何か文字を入力してからEnterキーを押してください。

このプログラムではSTLを使って表示と入力を行っています。

表示

std::cout << "文字を表示" << std::endl;

が表示を行っている部分です。std::coutはあらかじめヘッダファイルiostrem中で宣言されているstd::ostream型のオブジェクトです。

宣言はこのようになっています。

std::ostream cout;

coutはconsole outの略です。

<<は演算子です。+や=と同じように定義できます。

テンプレートクラスの中で

ostream& operator<<(T o){ .... }のように定義されています。

直感的にはstd::coutに<<の右側のものを入れるというイメージです。

最後のstd::endlは文字を改行して表示します。std::coutではすぐには表示せずにendlなどが与えられたときに表示します。他にstd::ends、std::flushなどがあります。

入力

std::cinはstd::outの逆で標準入力(通常はキーボード)から入力します。演算子逆向きの>>になっていることからもstd::cinから>>の右側へ入力するということが分かります。

利点

coutやcinはクラスやテンプレートの機能をうまく使って直感的な操作が可能です。printfでは表示する型を明示的に指定する必要がありましたがcoutではありません。例えば、以下のように記述できます。

std::cout << 1 << 'A' << "文字列" << 12.01 << std::endl;

入力も同様に適切な型が入ります。

int a;
double b;
char c;
char d[100];
std::cin >> a >> b >> c >> d; //一つ入力する度にEnterを押します。
std::cout << "a=" << a <<"\nb=" << b << "\nc=" << c <<"\nd=" <<d << std::endl;

欠点

printfの方が凝った表示は簡単なときがあります。よって、用途に合わせて使い分ける必要があります。

応用

ところで、coutが使えると前に説明したテンプレートクラスはもっと簡単になります。

プロジェクト名: stream2

//---------------------------------------------------------------------------
#include <iostream>

//---------------------------------------------------------------------------
class Object
{
public:
    virtual void print() = 0;
};

template<class T>
class TempObj : public Object
{
public:
    T obj;
    void print()
    {
        std::cout << obj << std::endl;
    }
};

int main()
{
    TempObj<int> num;
    num.obj = 100;

    TempObj<char> ch;
    ch.obj = 'A';

    TempObj<char*> t;
    t.obj = "Hello";

    Object* o[3];
    o[0] = &num;
    o[1] = &ch;
    o[2] = &t;

    for(int i = 0; i < 3; i ++)
    {
        o[i]->print();
    }

    fgetc(stdin);
    return 0;
}

こんなに短くなりました。更にTempObjのコンストラクタを定義してvectorを使うとよりすっきりします。

プロジェクト名:stream2を修正

//---------------------------------------------------------------------------
#include <iostream>
#include <vector>

//---------------------------------------------------------------------------
class Object
{
public:
    virtual void print() = 0;
};

template<class T>
class TempObj : public Object
{
    T obj;
public:
    TempObj(T o) //コンストラクタ
    {
        obj = o;
    }

    void print()
    {
        std::cout << obj << std::endl;
    }
};


int main()
{
    TempObj<int> num = 100;
    TempObj<char> ch = 'A';
    TempObj<char*> t = "Hello";

    std::vector<Object*> os;
    os.push_back(&num);
    os.push_back(&ch);
    os.push_back(&t);

    for(int i = 0; i < os.size(); i ++)
    {
        os[i]->print();
    }

    fgetc(stdin);
    return 0;
}

 

次へ進みます。