独習ゲーム制作
C++ part3
最終更新:
Bot(ページ名リンク)
-
view
クラスの概要
目次
仮引数を受け取るコンストラクタ
コンストラクタ関数には、引数を渡すことができ、そのクラスのオブジェクトを宣言する際に引数を指定します。
…
class myclass{
int a;
public:
myclass(int x);
…
};
class myclass{
int a;
public:
myclass(int x);
…
};
myclass::myclass(int x){
a = x;
}
…
a = x;
}
…
int main(){
myclass ob(4);
…
return 0;
}
myclass ob(4);
…
return 0;
}
練習問題5
作成持にコンストラクタで、現在のシステム時刻と日付を仮引数として受け取るt_and_dという名前のクラスを作成しなさい。このクラスに、受け取った時刻と日付を画面に表示するメンバ関数を含めます(時刻と日付を取得および表示するには、標準ライブラリの時刻関数と日付関数を使用します)。
継承 その1
C++には、ひとつのクラスが他のクラスの性質を受け継ぐ、継承という機構があります。継承される側(渡す側)のクラスを基本クラスといい、継承する側(受ける側)を派生クラスと言います。通常、基本クラスを最初に定義し、内容としては最も汎用的または土台になるような性質を記述します。そして、それに続いて特融の性質を持った派生クラスを定義します。
class derived-class-name : access-specifier base-class-name{
…
}
/* derived-class-name → 派生クラス名, access-specifier → public/private
/protected, base-class-name → 基本クラス名 */
…
}
/* derived-class-name → 派生クラス名, access-specifier → public/private
/protected, base-class-name → 基本クラス名 */
access-specifierでpublicを宣言した場合、基本クラスのpublicの部分には直接アクセスできるが、privateの部分は継承していても、直接アクセスすることは出来ません。基本クラスの非公開変数にアクセスしたいなら、基本クラスの公開関数などからアクセスするしかありません。
オブジェクトポインタ
オブジェクトへのポインタを作成し、クラスへアクセスする際にはドット演算子の代わりにアロー演算子(->)を用います。オブジェクトのポインタの宣言の仕方は通常のポインタとほとんど同じです。
…
class myclass{
…
public:
int a;
};
…
class myclass{
…
public:
int a;
};
…
int main(){
myclass ob;
/* myclass型のポインタ変数を宣言 */
myclass *p;
/* ポインタに&演算子を用いてobオブジェクトのアドレスを代入 */
p = &ob;
/* pにはobのアドレスが入っているのでp->aはob.aと同じ意味になる */
cout << p->a;
return 0;
}
myclass ob;
/* myclass型のポインタ変数を宣言 */
myclass *p;
/* ポインタに&演算子を用いてobオブジェクトのアドレスを代入 */
p = &ob;
/* pにはobのアドレスが入っているのでp->aはob.aと同じ意味になる */
cout << p->a;
return 0;
}
クラス、構造体、共用体の関連
クラス、構造体、共用体の宣言はとても似ています。またC++では、構造体や共用体は拡張され、クラスとさらに似た機能をもっています。
- 構造体の追加機能
- メンバ関数
- コンストラクタ関数
- デストラクタ関数
これが構造体の宣言です。
struct type-name{
/* 公開関数とデータメンバ */
private:
/* 非公開関数とデータメンバ */
}object-list;
/* type-name→構造体の型名 */
/* 公開関数とデータメンバ */
private:
/* 非公開関数とデータメンバ */
}object-list;
/* type-name→構造体の型名 */
クラスと構造体の違いは、構造体は初期でpublicになっており、privateを宣言するとによって、非公開メンバにすることができます。実際に構造体を用いる場合は、これまで通りデータメンバだけ宣言する場合が多いです。
共用体
共用体も構造体と同じく拡張されており、メンバ関数、コンストラクタ関数、デストラクタ関数を宣言することができ、初期でpublicです。また、C++の共用体にはいくつかの制限があります。
- C++の共用体の制限
- 継承することも、基本クラスにすることもできない。
- staticメンバを持つことができない。
- コンストラクタやデストラクタを持つオブジェクトを含むことができない。
- 仮想メンバ関数を持つことができない。
無名共用体
型名なしの特殊な共用体を無名共用体といいます。特徴は、同じメモリ位置を共有すること以外、メンバ変数を通常の変数と同じように使うことができることです。
union{ /* 無名共用体 */
int i;
char ch[4];
};
i = 10; /* 変数iにアクセスし、ディレクトリを変更する */
ch[0] = 'X';
int i;
char ch[4];
};
i = 10; /* 変数iにアクセスし、ディレクトリを変更する */
ch[0] = 'X';
無名共用体には、上の制限とさらに制限が追加されています。
- 無名共用体の制限
- グローバル無名共用体は、staticとして宣言しなければならない。
- 非公開メンバを含めることができない。
- メンバ名は、同じスコープ内の他の識別子と重複してはいけない。
インライン関数
インライン関数は、実際に呼び出す代わりに、各呼び出しごとにインラインで展開する関数を定義します。通常の関数はmain()関数などに記述すると単純に呼び出す処理でしかないのに対して、インライン関数は関数内の処理をコード中に直接埋め込みます。これによって、通常の関数より処理が速くなます。しかし、インライン関数は用いるほどにプログラム自体が大きくなってしまうので、一般に短い関数の場合のみインライン関数として宣言します。
inline ret-type func-name(parameter-list){
…
}
/* ret-type → int,void等, func-name → 関数名, parameter-list → 引数 */
…
}
/* ret-type → int,void等, func-name → 関数名, parameter-list → 引数 */
自動インライン化
クラスのメンバ関数の内容が短い場合、クラス内でメンバ関数の宣言から定義まで行うことによって、自動インライン化されます。
#include <iostream>
using namespace std;
using namespace std;
class myclass{
int a, b;
public:
…
/* int kakeru(int a, int b);までが宣言で、{}で囲った内容が定義です */
int kakeru(int a, int b){return a*b};
};
…
int a, b;
public:
…
/* int kakeru(int a, int b);までが宣言で、{}で囲った内容が定義です */
int kakeru(int a, int b){return a*b};
};
…