見出し画像

C言語からC++言語へ

この記事では、学校などでC言語を学習した人が、C++言語を最低限使用できるようにするための知識を紹介します。

C++言語とC言語、何が違う?

C++言語はC言語をもとに作られた、オブジェクト指向プログラミングが可能な言語です。1972年に誕生したC言語の11年後、1983年に誕生しました。

オブジェクト指向とは、クラスという設計図に、オブジェクトメソッド属性を書き込み、オブジェクトを作成しようという考えです。
例えば、RPGを作るとき、主人公やその仲間、敵は大体同じことをします(相手を攻撃したり、移動したり)。そのようなときは、キャラクターの設計図(クラス)を作成し、そこにメソッド(=関数など)を書き込んだり、属性(=変数など)を書き込みます。そして、そのクラスをもとに、キャラクター(=オブジェクト)を作成します。

RPGとオブジェクト指向の例

C++言語のHello World!

概要

さて、では早速C++を使ってみましょう。C++のファイルは拡張子を.cppとします。実は.cppファイルでも、C言語と同じプログラムを書いて動かすことができます。しかし、C++言語ではprintfはあまり使いません。次の例を見てください。

ソースコード

#include <iostream>

using namespace std;

int main(void) {
	cout << "Hello World!" << endl;

	return 0;
}

Hello World!

解説

なんとなくC言語に似てますね。上記のプログラムでは、まずiostreamをインクルードしています。iostreamはC言語でいうところのstdio.hと同じような役割をしていますが、.hはつけません。

次に、stdという名前空間を使用するために、using namespace std;としています。この名前空間というのはC++言語において非常に重要な概念です。
複数人のプログラマーが共同で開発を行うとき、関数や変数の名前が被ることがあります。これを解消してくれるのが名前空間で、例えば名前空間Aと名前空間Bがあったとして、名前空間AとBに同じ名前の関数があっても構わないということになります。

名前空間の例

coutやendlは名前空間stdのものですから、「名前空間のstdを利用するよ~」ということを知らせるためにusing namespace std;としたわけです。

そして、main関数内では、coutを使用して文字をモニターに出力しています。coutはprintfのように機能しますが、coutは関数ではなく、オブジェクトで、coutに<<という記号を用いて、標準出力ストリームに文字列を送り込んでいます。なお、endlは'\n'を送り込むだけでなく、バッファを空にすることができます。そのため、途中で出力を見たいデバッグにも便利なので、通常はendlを使うようにしましょう。

printfよりもcoutのほうがいい理由

C言語で登場したprintfよりも、C++のcoutの方に慣れておいたほうが普通はいいです。coutなら%dやら%cやら%fやら%sやらを書かずに済みますし、自分で作成した構造体もオペレーター<<をオーバーロードすることで表示することができます(オーバーロードについては後から解説するかもしれません)。兎にも角にもcoutはprintfよりも拡張性に優れるので、そちらを使ったほうがいいよというお話でした。

C++言語のscanfと文字列

char[]とstring

C言語では、文字列はchar型の配列として扱いました。そのため、scanfを用いて文字列を入力してもらう際、事前に宣言した分の文字しか入力ができませんでした。すると、scanfを用いた入力で、想定よりも多くの文字列が入力されると予期せぬ動作を引き起こしてしまうというセキュリティ上の問題もありました。
また、文字列の比較には<string.h>をインクルードして、わざわざstrcmpという関数を使用する必要がありました。

C++言語では、文字列を扱う際はstringというクラスを用います。クラスは、typedefされた構造体のようなもので、変数のように宣言することでオブジェクトとして使用できるようになります。次の例を見てみましょう。

#include <iostream>

using namespace std;

int main(void) {
	string hoge = "apple";

	cout << hoge << endl; //stringクラスのオブジェクトは、coutで出力できる。
	cout << "上の文字列のサイズ:" << hoge.size();

	return 0;
}

apple
上の文字列のサイズ:5

この例では、hogeという名前のオブジェクトに"apple"を代入し、その内容とサイズを表示しています。サイズを表示するためには、構造体のメンバにアクセスするように'.'(コンマ)を用いて、メソッドの関数を使います。

このように、クラスとは構造体に関数も入れられるようにしたようなもので、stringクラスには様々な関数が用意されています。さらに次の例では、文字列を整数型のように扱っています。

#include <iostream>

using namespace std;

int main(void) {
	string hoge1 = "I like ";
	string hoge2 = "apples";

	string sentence = hoge1 + hoge2; //steingのオブジェクトは、足し算によって結合できる。

	cout << sentence << endl;

	
	
	string hoge3 = "apples";


	cout << hoge2 << " and " << hoge3 << " are ";

	if (hoge2 == hoge3) {
		cout << "equal";
	}
	else {
		cout << "not equal";
	}


	return 0;
}

I like apples
apples and apples are equal

stringのオブジェクトは、+記号で文字列を結合することが可能で、さらに==で文字列同士の比較もできることがわかります。stringで文字列を扱うとchar[]よりも直感的で、文字数の制限を気にすることなくかけるのでぜひともstringを使いましょう。

scanfとcin

では、次に文字列をcinを用いて入力してみましょう。早速次の例をご覧ください。

#include <iostream>

using namespace std;

int main(void) {
	string input;

	cout << "input string:";
	cin >> input;

	cout << "You inputed ... " << input;

	return 0;
}

input string:HogeHoge
You inputed ... HogeHoge

cinを用いると、簡単に文字列の入力が可能です。int型などの変数も同じ方法で入力できます。そして、string型を使うことの最大のメリットは、事前に最大文字数を決定しておかなくてもよいということです。C言語では、

#include <stdio.h>

#define INPUT_MAX_CHAR 256

int main(void) {
	char input[INPUT_MAX_CHAR];
	
	printf("input string:");
	scanf("%s", input);

	printf("You inputed ... %s", input);

	return 0;
}

上記の例のように事前に文字数を決めておく必要がありましたが、C++ではそのような心配はありません。scanfはセキュリティ的にも脆弱なので、ぜひcinを使ってみましょう。

まとめ

  • printfの代わりにcoutを、

  • scanfの代わりにcinを、

  • char[]の代わりにstringを使おう。

  • クラスは設計図。メソッドはクラスの関数。属性はクラスの変数。クラス名を型として宣言して、オブジェクトを生成しよう。

…次回に続くかも?

いいなと思ったら応援しよう!