情報処理のWeb教科書―IPA情報処理試験対策のお供に!

C++―フリーソフトのg++コンパイラでコンパイルして学ぶC++入門テキスト

トップ プログラミング C++

Windowsでも使えるフリーソフトのg++コンパイラで学ぶC++入門用のオリジナルテキストをまとめています。C++は、C言語から派生した言語となり、本サイトの「フリーソフトのgccコンパイラでコンパイルして学ぶC言語入門テキスト」の続きという形でまとめています。

▲記事トップへ

目次

この記事の目次です。

1. C++とは
2. クラス
3. 継承
4. 呼び出し規約
5. 標準ライブラリ
6. g++コンパイラ

もっと知識を広げるための参考
更新履歴

1. C++とは

C++はC言語にオブジェクト指向の基礎となるクラスの概念などを拡張した言語です。 もともとはクラス付きのC言語と呼ばれていて、後にCをインクリメント(++)したC++という呼び方になりました。

2. クラス

C++ではオブジェクト指向に対応しています。 オブジェクト指向の中核にあるクラスについて解説します。

クラスとは

C++ではメモリ上にオブジェクトというものを作って仕事をさせることができます。 そのオブジェクトを作る準備としてオブジェクトの設計図を用意する必要があります。 このオブジェクトの設計図のことをクラスといいます。

なお、オブジェクトはクラスを実体化したものということでインスタンスという言葉が使われることがあります。

クラス定義の構文

クラス定義の構文です。

基本構造

クラスは以下のように記述します。

class クラス名 {
	定義の中身
};

メンバ変数の定義

クラスのブロックの中で定義するとメンバ変数になります。 メンバ変数はクラス内でデータを保持する変数です。

class クラス名 {
	型 メンバ変数名;
};

メンバ関数の定義

クラスのメンバ関数は以下のように記述します。クラス定義の外に関数の定義を記述する際に「クラス名::」が付きます。

class クラス名 {
	戻り値型 メンバ関数名(あれば引数型 仮引数名);
};

戻り値型 クラス名::メンバ関数名(あれば引数型 仮引数名) {
	関数の処理;
}

オブジェクト実行

オブジェクトの生成は変数の宣言と同じです。 クラス名を型にした変数を宣言します。 実行は変数+「.」+メンバ関数という形で実行できます。

クラス名 オブジェクト名;
オブジェクト名.メンバ関数名;

クラス定義とオブジェクト実行の例

クラスの定義とオブジェクトの実行を行う例です。privateはクラス内、publicはクラス外から利用できます。

#include <iostream>
using namespace std;

class Num {
private:
	int n;
public:
	void setNum(int value);
	void showNum();
};

void Num::setNum(int value) {
	n = value;
}

void Num::showNum() {
	cout << "num=" << n << "\n";
}

int main() {
	Num n;
	n.setNum(7);
	n.showNum();
}

コンパイルと実行方法

C++のコードのコンパイルにはgccと同じ作法のg++コンパイラが利用できます。

たとえば、ソースファイルをsample.cppとした場合は以下のようにコンパイルできます。

g++ sample.cpp

コンパイルするとWindowsの場合、a.exe、Linuxの場合はa.outができます。 サンプルを実行すると以下のように表示されます。

a.exe
num=7

constメンバ関数

メンバ変数の値を変更することなく読み込み専用の関数などは、constを指定してメンバ変数を変更できないようにできます。 これにより思わぬ変更を防止することができます。

#include <iostream>
using namespace std;

class Num {
private:
	int n;
public:
	void setNum(int value);
	void showNum() const;
};

void Num::setNum(int value) {
	n = value;
}

void Num::showNum() const {
	cout << "num=" << n << "\n";
}

int main() {
	Num n;
	n.setNum(7);
	n.showNum();
}

コンストラクタ

コンストラクタはオブジェクト生成時に自動で呼び出されるメンバ関数です。

class クラス名 {
public:
	クラス名(あれば引数型 仮引数名);
};

クラス名::クラス名(あれば引数型 仮引数名) {
	関数の処理;
}

コンストラクタはクラスと同じ名前の関数で、頭には型を記述しません。

初期化子

コンストラクタには初期化子というクラスのオブジェクト生成時に、データメンバの値を初期化(設定する)仕組みがあります。

class クラス名 {
private:
	データ型 データメンバ変数名;
public:
	クラス名(引数型 仮引数名) : データメンバ変数名(仮引数名);
};

クラス名::クラス名(あれば引数型 仮引数名) : データメンバ変数名(仮引数名) {}

コンストラクタの定義に「 : データメンバ変数名(仮引数名)」とすることで「データメンバ変数名」のデータメンバに「仮引数名」の仮引数の値が設定できます。 また「 : データメンバ変数名1(仮引数名1), :データメンバ変数名2(仮引数名2),...」とカンマで区切ることで複数の初期化子が使えます。

3. 継承

C++では継承が使えます。 あるクラスとの差分をコーディングすることでそのクラスの機能も利用できます。

オーバーロード

オーバーロードとは、「引数や戻り値が異なるが名称が同一のメソッドを複数定義する」というオブジェクト指向プログラミングのテクニックです。

オペレーターのオーバーロード

C++では、ユーザー定義クラスに対して演算子を機能させることができて、データ型に対して特別な意味を演算子に提供する機能があります。 この機能は、演算子のオーバーロードといいます。 たとえば、Stringなどのクラスで演算子「+」をオーバーロードして、+を使用するだけで2つの文字列を連結できるようにすることができます。

4. 呼び出し規約

引数が関数へ渡される方法や関数から値が返される方法について規則を規定する多くの呼び出し規約があります。

Windowsの呼び出し規約

たとえば、Windowsの呼び出し規約に「__fastcall」があります。 「__fastcall」は引数がスタックではなく、レジスターで渡されるように指定する高速な呼び出し規約です。

5. 標準ライブラリ

標準ライブラリの利用方法についてまとめていきます。

cmath

cmath関連です。cmathのヘッダファイルはcmath.hです。

std::fmod

std::fmod関数は浮動小数点数の剰余を求めます。 第1引数xを第2引数yで割ることによって得られる剰余を返します。

cstddef

cstddef関連です。cstddefのヘッダファイルはcstddef.hです。

NULL

NULLです。使用例は以下です。

if (FBackendHandle != NULL) {
	:
}
error: 'NULL' was not declared in this scope

g++コンパイラで「error: 'NULL' was not declared in this scope」のように表示された場合は「#include <cstddef>」が記述されているか確認しましょう。

cstdlib

cstdlib関連です。cstdlibのヘッダファイルはcstdlib.hです。

std::rand

std::randは⁰以上のランダムな整数値となる乱数を取得します。

#include <ctime>
#include <cstdlib>
:
std::rand(std::time(NULL));
int randNum = rand() % 10;

std::rand関数が出力する乱数は引数によって決まりますので、上記の例のように現在の時刻を与えて生成された乱数を使用するのが一般的です。 「rand() % 10」のように余りを使用することで特定範囲の乱数が得られます。

ctime

ctimeは時間を扱うための機能を提供するライブラリです。 ctimeのヘッダファイルはctime.hです。

std::time

std::timeは時刻を取得します。 std::time(NULL)と引数にNULLを与えると現在の時刻が取得できます。

iostream

iostreamは画面やキーボードなどへの入出力を扱うための機能を提供するライブラリです。 iostreamのヘッダファイルはiostream.hです。

std::cin

cinはconsole inの略で、std::cinはコンソールからの入力を受けつけます。

int x;
std::cin >> x;

このように>>(抽出子)を使用して変数に入力された値が代入されます。 なお、文字列の場合はスペースまでとなります。スペースを使用する場合はstd::getlineが使えます。

std::cout

coutはconsole outの略で、std::coutはコンソール画面に文字を出力します。

std::cout << "Hello World!!\n";

このように<<(挿入子)の後に文字列を記述します。

memory

memory関連です。memoryのヘッダファイルはmemory.hです。

std::auto_ptr

std::auto_ptrは、メモリの開放管理を自動的に行うためのものです。

error: 'auto_ptr' in namespace 'std' does not name a template type

g++コンパイラで「error: 'auto_ptr' in namespace 'std' does not name a template type」のように表示された場合は「#include <memory>」が記述されているか確認しましょう。

string

stringは文字列を扱うための機能を提供するライブラリです。 stringのヘッダファイルはstring.hです。

std::wstring

std::wstringは、ワイド文字用の文字列クラスです。 std::wstringは、文字型としてwchar_tを使用し、デフォルトのchar_trait型とアロケータ型を持つbasic_stringクラステンプレートのインスタンスです。

6. g++コンパイラ

g++とは、GNUのGCCに含まれるC++のコンパイラのことをいいます。 UnixやWindowsでg++コマンドとして利用できます。

オプションの例

g++のオプションの例です。

oオプション

g++の-oオプションを使用して、実行ファイルなど出力ファイル名が指定できます。

g++ <c++ソースファイル> -o <出力ファイル名>

Lオプション

g++の-Lオブションを使用して、ライブラリのディレクトリパスを指定方法について見ていきます。

-Lオプションの使用方法

-Lオプションを使用することで、リンクするライブラリ(-lオプション)を探すディレクトリができます。

g++ <c++ソースファイル> -I<ヘッダファイルディレクトリパス> -L<ライブラリディレクトリパス> -l<ライブラリ> -o <出力ファイル名>

※-Lの後にスペースは入れません。

共有ライブラリ(.so)の作成方法

まず、ライブラリとして、以下のコードのhello.cppというソースを用意します。

#include <iostream>
using namespace std;

void hello(){
  cout << "Hello World !!" << endl;
}

共有ライブラリを作るには以下のコマンドでコンパイルします。

$ g++ -shared hello.cpp -o libhello.so

これで共有ライブラリlibhello.soができ上がります。

共有ライブラリ(.so)の使用方法

テストのために、以下のように呼び出すプログラム(test.cpp)を作成してみます。

#include <iostream>
using namespace std;

int main(void) {
  hello();
  return 0;
}

これをコンパイルするには
g++ test.cpp -o test ./libhello.so
とします。

実行すると
$ ./test
Hello World !!
と表示されます。もしlibhello.soを削除したり移動したりするとエラーが出ます。

もっと知識を広げるための参考

更新履歴

戻る

スポンサーリンク

情報処理の知識体系

各試験の問題と解説

ランダム出題・採点アプリ

プログラミング

スポンサーリンク