文字の出力は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] = #
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;
}