情報処理のWeb教科書―IPA情報処理試験対策のお供に!
Windowsでも使えるフリーソフトのg++コンパイラで学ぶC++入門用のオリジナルテキストをまとめています。C++は、C言語から派生した言語となり、本サイトの「フリーソフトのgccコンパイラでコンパイルして学ぶC言語入門テキスト」の続きという形でまとめています。
この記事の目次です。
1. C++とは
2. クラス
3. 継承
4. 呼び出し規約
5. 標準ライブラリ
6. g++コンパイラ
C++はC言語にオブジェクト指向の基礎となるクラスの概念などを拡張した言語です。 もともとはクラス付きのC言語と呼ばれていて、後にCをインクリメント(++)したC++という呼び方になりました。
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を指定してメンバ変数を変更できないようにできます。 これにより思わぬ変更を防止することができます。
#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),...」とカンマで区切ることで複数の初期化子が使えます。
C++では継承が使えます。 あるクラスとの差分をコーディングすることでそのクラスの機能も利用できます。
オーバーロードとは、「引数や戻り値が異なるが名称が同一のメソッドを複数定義する」というオブジェクト指向プログラミングのテクニックです。
C++では、ユーザー定義クラスに対して演算子を機能させることができて、データ型に対して特別な意味を演算子に提供する機能があります。 この機能は、演算子のオーバーロードといいます。 たとえば、Stringなどのクラスで演算子「+」をオーバーロードして、+を使用するだけで2つの文字列を連結できるようにすることができます。
引数が関数へ渡される方法や関数から値が返される方法について規則を規定する多くの呼び出し規約があります。
たとえば、Windowsの呼び出し規約に「__fastcall」があります。 「__fastcall」は引数がスタックではなく、レジスターで渡されるように指定する高速な呼び出し規約です。
標準ライブラリの利用方法についてまとめていきます。
cmath関連です。cmathのヘッダファイルはcmath.hです。
std::fmod関数は浮動小数点数の剰余を求めます。 第1引数xを第2引数yで割ることによって得られる剰余を返します。
cstddef関連です。cstddefのヘッダファイルはcstddef.hです。
NULLです。使用例は以下です。
if (FBackendHandle != NULL) { : }
g++コンパイラで「error: 'NULL' was not declared in this scope」のように表示された場合は「#include <cstddef>」が記述されているか確認しましょう。
cstdlib関連です。cstdlibのヘッダファイルはcstdlib.hです。
std::randは⁰以上のランダムな整数値となる乱数を取得します。
#include <ctime> #include <cstdlib> : std::rand(std::time(NULL)); int randNum = rand() % 10;
std::rand関数が出力する乱数は引数によって決まりますので、上記の例のように現在の時刻を与えて生成された乱数を使用するのが一般的です。 「rand() % 10」のように余りを使用することで特定範囲の乱数が得られます。
ctimeは時間を扱うための機能を提供するライブラリです。 ctimeのヘッダファイルはctime.hです。
std::timeは時刻を取得します。 std::time(NULL)と引数にNULLを与えると現在の時刻が取得できます。
iostreamは画面やキーボードなどへの入出力を扱うための機能を提供するライブラリです。 iostreamのヘッダファイルはiostream.hです。
cinはconsole inの略で、std::cinはコンソールからの入力を受けつけます。
int x; std::cin >> x;
このように>>(抽出子)を使用して変数に入力された値が代入されます。 なお、文字列の場合はスペースまでとなります。スペースを使用する場合はstd::getlineが使えます。
coutはconsole outの略で、std::coutはコンソール画面に文字を出力します。
std::cout << "Hello World!!\n";
このように<<(挿入子)の後に文字列を記述します。
memory関連です。memoryのヘッダファイルはmemory.hです。
std::auto_ptrは、メモリの開放管理を自動的に行うためのものです。
g++コンパイラで「error: 'auto_ptr' in namespace 'std' does not name a template type」のように表示された場合は「#include <memory>」が記述されているか確認しましょう。
stringは文字列を扱うための機能を提供するライブラリです。 stringのヘッダファイルはstring.hです。
std::wstringは、ワイド文字用の文字列クラスです。 std::wstringは、文字型としてwchar_tを使用し、デフォルトのchar_trait型とアロケータ型を持つbasic_stringクラステンプレートのインスタンスです。
g++とは、GNUのGCCに含まれるC++のコンパイラのことをいいます。 UnixやWindowsでg++コマンドとして利用できます。
g++のオプションの例です。
g++の-oオプションを使用して、実行ファイルなど出力ファイル名が指定できます。
g++ <c++ソースファイル> -o <出力ファイル名>
g++の-Lオブションを使用して、ライブラリのディレクトリパスを指定方法について見ていきます。
-Lオプションを使用することで、リンクするライブラリ(-lオプション)を探すディレクトリができます。
g++ <c++ソースファイル> -I<ヘッダファイルディレクトリパス> -L<ライブラリディレクトリパス> -l<ライブラリ> -o <出力ファイル名>
※-Lの後にスペースは入れません。
まず、ライブラリとして、以下のコードのhello.cppというソースを用意します。
#include <iostream>
using namespace std;
void hello(){
cout << "Hello World !!" << endl;
}
共有ライブラリを作るには以下のコマンドでコンパイルします。
$ g++ -shared hello.cpp -o libhello.so
これで共有ライブラリlibhello.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を削除したり移動したりするとエラーが出ます。
Windowsでも使えるフリーソフトのgccコンパイラで学ぶC言語入門用のオリジナルテキストをまとめています。 フリーソフトのgccコンパイラのインストール方法や基本文法はもちろんですが、分割コンパイルやヘッダーファイルの作成方法など入門者にとって気になる内容もまとめています。
プログラミング作法などプログラミングについてまとめています。Python、C言語、流れ図などプログラミングのオリジナル入門テキスト問形でまとめています。
Copyright (C) 2010-2023 情報処理のWeb教科書. All Rights Reserved. Loarding…