C++初心者のための基礎講座

これからC++によるプログラミングを学びたいという初心者の方に向けて、基本的な考え方を具体的なソースコードと共に紹介したいと思います。C++は比較的学習することが難しいと言われますが、基本的な操作や考え方をきちんと押さえれば様々な用途に応用できる言語です。この記事を通じて、C++によるプログラミングの基本をマスターしましょう!

C++とは

C++の特徴

C++はC言語にオブジェクト指向の考え方を取り入れて拡張した言語です。オブジェクト指向を取り入れることで、C言語が苦手とした再利用のしやすいプログラムの作成が可能となりました。OS開発や組み込みシステムの開発、ウェブアプリケーション開発や一般的なソフトウェア開発など、広い範囲で利用されている言語の一つです。

オブジェクト指向とは

オブジェクト指向とは、特定の目的を解決するために、オブジェクトと呼ばれる「もの」や「こと」をプログラムに落とし込み、オブジェクト同士を「メッセージ」と呼ばれるやりとりを通じて制御していくアプローチのことを指します。オブジェクトを活用することによって、様々な制御がそれぞれのオブジェクトに任せて実行されるため、プログラマが考慮すべき事柄が少なくて済みます。そのため、他のプログラマが定義したオブジェクトと組み合わせた、大規模で効率的な開発が可能です。

文字の入出力

Hello, World

それでは、新しいプログラミング言語を学ぶときの最初の一歩といえば、”Hello, world!”です。C++による”Hello, world!”は、1. ソースコードの記述、2. ソースコードのコンパイル、3. コンパイルした結果の実行の3つのステップから構成されます。まずは「ソースコードの記述」から始めていきましょう。

次のコードを”hello.cpp”というファイルに書き込み、保存してください。

#include <iostream>
using namespace std;

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

C++はC言語と同様に、コンパイルが必要なプログラミング言語であるため、先ほど作成した”hello.cpp”をコンパイルする必要があります。ソースコードのコンパイルは次のコマンドで実行できます。

g++ hello.cpp -o hello

最後に、コマンドプロンプトに以下のコマンドを入力することで、作成したプログラムの実行が可能です。

./hello

“Hello, world!”という文字列が表示されれば、プログラムの記述がうまくできています。もしエラーが発生した場合には、プログラムの命令文の最後にセミコロンを忘れていたり、スペルを間違えていないか確かめてみましょう。

名前空間

名前空間とは

「名前空間」という慣れない単語を耳にすると身構えてしまいそうですが、特にプログラミングに限った話ではなく、現実の世界でも利用されている考え方の一つです。その一例としては、住所が挙げられるでしょう。

例えば「北区」という名称の区は日本全国に複数存在しますが、「東京都の」「京都市の」といった空間を説明してあげることにより、どの「北区」を指しているのかを一意に定めることができます。同様に苗字を考えてみても、同じ「太郎」でも、「佐藤」なのか「山本」なのかによって誰を指しているのかを決定することができます。

プログラミングにおける名前空間とは、プログラムに登場する関数や変数などの名前(識別子)に定められた有効な領域のことを指します。その役割は市区町村の名前や苗字の例と同様に、「どのファイルの」であったり「どの関数の」といった範囲を決め、対象となる関数や変数を一意に定めることです。

C++では、”using”というキーワードを用いて名前空間を利用可能です。先ほどの”Hello, world!”の例においても、”std”という名前空間から”cout”という変数を利用しています。

関数

オーバーロード(多重定義)

オーバーロードとは、役割が違いに異なる関数やメソッドを同じ名称で複数定義することです。オーバーロードされた同一名称の関数やメソッドは、実行されるプログラムの文脈に応じてその振る舞いを変化させます。

名前が同じであるものの引数の型が異なる関数や演算子をいくつか定義することで、同じ名前の関数や演算子の呼び出しでも、実引数となる変数の型に応じて適切な手続きを実行することができます。オーバーロードを利用するメリットとしては、プログラマが引数の型を逐次的に考慮して名前の異なる別々の処理を呼び出す必要がなくなることが挙げられるでしょう。

参照


プログラミングにおける参照とは、ある領域にあるデータを指し示す情報を持っているオブジェクトのことを指します。実際にメモリ上に格納されている値そのものを言うのではなく、その値を取り出すための情報を保持しているものが参照です。

C++における参照とは、すでにプログラム上で登場した変数に対して別の名前を付与するオブジェクトとして考えることができます。以下のプログラムを見てみましょう。

int x = 10;
int& y = x;

1行目では単に”x”という名前の変数を宣言し、その”x”に10という値を代入しています。2行目で宣言される”y”という変数には、変数”x”が保持する10という値へのアクセス方法が代入されています。

この”y”のように,他のオブジェクトの値への参照を保持するものをC++では「参照型」の変数と呼び、そのもともとの型に”&”記号を加えることで宣言できます。結果として、”y”は”x”と同じ値を共有することになるため、もともとの変数”x”に対して、”y”という別名を与える操作がC++における参照と言えるでしょう。

参照渡し

「参照渡し」とは、関数やオブジェクトのメソッドの引数の渡し方の一つです。参照渡しの他には「値渡し」といった引数の渡し方があります。次の例をみて、値渡しを実装した”call_by_val”と、参照渡しを実装した”call_by_ref”を定義し、実際の動作を比べてみましょう。

#include <iostream>
using namespace std;

void put(int msg) {
cout << msg << endl;
}

void call_by_val(int x) {
x = 0;
}

void call_by_ref(int& x) {
x = 0;
}

int main() {
int a = 10;
put(a);
call_by_val(a);
put(a);
call_by_ref(a);
put(a);
return 0;
}

このプログラムの実行結果は次のようになります。

10
10
0

“call_by_val”と”call_by_ref”の違いは、引数の型を表す箇所が”int x”であるか、”int& x”であるかです。引数が「値渡し」である”call_by_val”を実行しても、その実引数である”a”そのものの値は変化しません。その一方で、引数が「参照渡し」である”call_by_ref”では、引数に対する参照が渡されているため、共有されたオブジェクトの”a”の実際の値を操作し、その値が0となっています。
C++では値渡しや参照渡しといった複数の引数の渡し方が存在することを覚えておきましょう。

まとめ

今回はプログラミングの第一歩である”Hello, world!”と、C++を特徴付ける名前空間やオーバーロード、参照渡しについて学びました。はじめのうちは具体的なイメージが湧かず、なかなか頭に入らない場合もありますが、他のプログラマのコードをみて、自分でプログラムを書いていくうちに手で覚えていくことができるでしょう。

関連記事

ページ上部へ戻る