Youtube登録者5000人突破!!

【C++】名前空間(スコープ)・入力 【はじめてのC++プログラミング入門講座 #6】

はじめてのC++プログラミング入門講座では、プログラミングをやったことのない人でも分かるように、C++について解説します。まずは、C++を知るところからはじめて、初心者がつまづきやすい「ポインタ」までをゴールとして進めていきます。全て無料で学べる内容となってますので、ぜひ最後までお付き合いください。

丁寧に学ぶをモットーに、ひとつずつじっくりと理解しけるように解説します。 はじめは少し退屈かもしれませんが、基礎を身に着けておくと、後が楽になります。また、プログラミング学習でよくあるのが、飛ばしすぎて途中で挫折してしまうことです。続けさえすれば力になります。じっくりゆっくり学んでいきましょう。

本講座はC++の開発環境が必要です。環境構築には第1回のVisual Studioの環境構築を参考にしてください。下記からどうぞ。

前回の第5回では、if文について解説しました。詳細は下記からどうぞ。

重要なポイントは下記の通りです。if文を使うことで、状況に応じてプログラムの実行を操作することができます。特にbool型とif文は密接な関係にあるので、ぜひ一緒に理解しておきましょう。

  • 変数は数学のxやyのように好きなものを入れられる
  • 代入演算子を使うと、変数に追加で足したり引いたりするプログラムがシンプルになる
  • x += 3 はxに3を足すことを意味する(x=x+3 と同じ意味になる)
  • インクリメントを使うaseを返す
  • AND条件は「&&」、OR条件は「||」を使用する

名前空間(スコープ)・入力

ここでは、名前空間と入力という2つの機能を紹介します。

名前空間とは簡単に言うと、「変数を使える範囲」のことです。例えば、今まではmain関数内でプログラムを書いていますが、ここで宣言した変数は、通常はmain関数の外ではその変数は使えません。

ここで重要なのは「main関数で宣言した変数は、main関数外でその変数は使えない」ということです。逆に言えば、main関数外であれば同じ名前の別の変数を使うことが出来ます。

これは、次のシリーズの「C++初級講座」で紹介する「オブジェクト指向」とすごく相性が良いです。これはつまり、main関数より外であれば、main関数内の変数を気にせず、好きなようにプログラムを書くことができるということなので、大人数でプログラミングをするときに非常に便利です。今はまだルールとして知っておくだけで大丈夫です。勉強を進めるうちに、その重要性に気づくでしょう。

#include <iostream>
#include <string>

using namespace std;

int main()
{
	std::cout << "Hello world\n";
	cout << "Hello world\n";

	std::cout << "Hello world" << std::endl;
	cout << "Hello world" << endl;

	std::string message = "I love";
	string message2 = "I love";

	{
		int x = 10;
		cout << x << endl;
	}

	if(true){
		int x = 10;
		cout << x << endl;
	}

	cin >> message;
	cout << message;
}

出力結果は下記のようになります。

Hello world
Hello world
Hello world
Hello world
10
10
ここは入力です
ここは入力です

それではコードの中身を見ていきましょう。

ライブラリとメイン関数

#include <iostream>
#include <string>
・・・
int main()
{
・・・
}

今回もインクルードするライブラリは入出力ライブラリのiostreamと文字列を操作するstringです。残りのコードは全てメイン関数の中に書いていきます。

名前空間

標準ライブラリでを使用する際には、今までは頭に「std」を付けていました。しかし、毎回毎回「std」をつけるのは面倒です。

そういうときのために、名前空間の特殊な機能として、ライブラリの頭の文字を省略する機能があります。

using namespace std;

using namespace stdを書くことで、これより下のプログラムではstdを省略して書くことができます。意味としては、「stdの名前空間を使用する」という意味です。例を見ながら理解していきましょう。

	std::cout << "Hello world\n";
	cout << "Hello world\n";

	std::cout << "Hello world" << std::endl;
	cout << "Hello world" << endl;

	std::string message = "I love";
	string message2 = "I love";

std::cout というのは、標準ライブラリ(std)内のcoutを使用するという意味です。stdは一つの名前空間であり、stdという大きな集まりの中のcoutという機能を呼び出すといった、階層構造になっています。

今回は、using namespace stdをすでに記入しているので、std::を省略して書くことができます。そのため 、coutやendl、stringの頭のstd::を省略して書いてもエラーは出ません。

動作のイメージとしては、フォルダの階層構造をイメージして頂くとわかりやすいです。本来は最も上のフォルダまでしか読み込まなかったのが、 using namespace std を入れることで「std」内のフォルダも追加で読み込むようになったイメージです。そのため、std::を省略しても省略しなくても全く同じ動作になります。

ただし、名前空間にも当然役目があり、using namespaceを多用しすぎると問題が発生します。例えば、多くのライブラリをインクルードした状態で、 using namespace を多用して省略表記をすると、ライブラリ同士のメソッドが被って予期しない動作になることがあります。using namespaceは最小限の使用に留めておきましょう。

	{
		int x = 10;
		cout << x << endl;
	}

	if(true){
		int x = 10;
		cout << x << endl;
	}

次は変数の名前空間についてです。名前空間は波カッコ内{}で定義されるので、例えばメイン関数内で定義された変数はメイン関数内でしか使えません。メイン関数で定義した変数はメイン関数の最後の波カッコを抜けると、全て消えてしまいます。

この機能を活用することで、限定した範囲だけで変数を扱うことができます。上記の記述では、変数xが二回宣言されていますが、エラーは発生しません。これは、それぞれの名前空間(スコープ)が異なるからです。

このような書き方をすることで、長いプログラムにおける変数被りの問題を無視することができます。また、スコープ内で変数を宣言してやれば変数を確保する時間が短くなるので、メモリの消費も少なくなります。

無駄にスコープを設置する必要はないですが、変数は極力狭いスコープで使用するというのがプログラミングのセオリーです。例えば、if文やfor文の内部でしか使わない変数は、それぞれの文の中で変数を宣言するようにしましょう。

入力

	cin >> message;
	cout << message;

今まではcoutという出力機能を多用してきましたが、iostreamは入出力ライブラリなので、入力機能もあります。

std::cin >> を使用することで、実行時の入力を変数に与えることができます。このプログラムではusing namespace stdを行っているので、std::は省略しています。

入力ができるようになれば、実行時にユーザーの動きに応じて出力を変化させることができます。例えば、電卓なんかは入力した値の計算結果を出力するだけなので、今のプログラミングスキルでも作ることができます。

おわりに

今回は名前空間と入力について解説しました。 名前空間とは簡単に言うと、「変数・関数を使える範囲」のことです。

名前空間をうまく活用することで、例えば、using namespace stdを書くことで標準ライブラリの名前空間も使用できるようにしたり、変数被りを気にしないプログラミングができたり、メモリを節約することができます。

入力機能は、実行時の入力をプログラムに取り入れることができます。これによって、ユーザーの行動に応じた結果を得ることができるので、電卓のような仕組みを作ることができます。

重要な項目は下記の通りです。特に、using namespace stdは多用されるので覚えておきましょう。また、変数宣言を狭く取るのも多くのプログラマーが息をするように行なえます。初めはどこで変数を宣言すべきか意識してプログラムを修正しましょう。

  • 名前空間(スコープ)を使えば、限定的な範囲で変数や関数を使うことができる
  • 波カッコで囲んだ範囲が名前空間となる
  • using namespace は、名前空間の表記を省略する機能である
  • using namespace std を使えば、標準ライブラリ内のメソッドもstd::表記を省略して使える
  • 変数宣言は可能な範囲で名前空間を狭くとる(if文、for文内に書くなど)
  • iostreamライブラリのcinを使えば、実行時に入力を与えられる

次回はfor文と配列について解説します。

for文は繰り返し機能であり、PCに自動化させる際に最も強力な機能です。人間では耐えられないような繰り返しを難なく行うことができます。

配列は、まとめて変数を格納する機能です。データ量が多くなると、一つ一つの変数を作成してその中に値を入れるのが面倒になります。また、宣言した変数をまとめて操作したいという場合にも配列は役に立ちます。

youtubeでも解説しています。簡単に噛み砕いているので、ちょっと難しいと感じた方は下記からどうぞ。