メンバ関数¶
クラスが持つ関数をメンバ関数といいます。
長方形を扱う Rectangle クラスに
面積を求めるメンバ関数 Area を持たせるには次のようにします。
class Rectangle {
public:
int Area() {
return height_ * width_;
}
int height_;
int width_;
};
メンバ関数を使用するには . を使用します。
Rectangle r;
r.height_ = 10;
r.width_ = 20;
r.Area();
クラス宣言とは別に定義¶
クラス宣言とは別にメンバ関数を定義するには次のようにします。
class Rectangle {
public:
int Area();
int height_;
int width_;
};
int Rectangle::Area() {
return height_ * width_;
}
どのクラスのメンバ関数であるかを表すために Rectangle:: が必要になります。
暗黙的な inline 指定
クラス宣言の中でメンバ関数を定義した場合、暗黙的に inline 指定されます。
そのため、ヘッダファイルのクラス宣言の中でメンバ関数を定義しても
リンク時にエラーにはなりません。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | |
1 2 3 4 5 6 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | |
クラス宣言とは別にメンバ関数を定義すると暗黙的な inline 指定はされなくなります。 ヘッダファイル内でクラス宣言とは別にメンバ関数の定義を行うとリンク時にエラーとなります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | |
ヘッダファイル内でクラス宣言とは別にメンバ関数の定義を行うには、
明示的に inline 指定する必要があります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | |
const メンバ関数¶
引数リストのあとに const をつけることで const メンバ関数になります。
class Rectangle {
public:
int Area() const;
};
const メンバ関数ではデータメンバを変更することができません。
class Rectangle {
public:
int Area() const;
int height_;
int width_;
};
int Rectangle::Area() const {
height_ = 0; // データメンバを変更するとコンパイルエラーになります
return height_ * width_;
}
const メンバ関数はデータメンバを変更しないため、
オブジェクトの状態を変化させずに呼び出すことができます。
データメンバを変更しないという制約を満たすために、
const メンバ関数から呼び出せるメンバ関数は const メンバ関数に限定されます。
this ポインタ¶
メンバ関数では this で自オブジェクトのポインタを取得することができます。
class Rectangle {
public:
int Area();
int height_;
int width_;
};
int Rectangle::Area() {
// this ポインタ経由でデータメンバを使用
return this->height_ * this->width_;
}