2017年11月03日
《その105》 静的データメンバ
静的データメンバ
静的データメンバというのは、クラス定義の中で、static付きで宣言されたデータメンバのことです。
static付きデータメンバの実体は、個々のクラスオブジェクトごとに作られるのではなく、メモリ空間の中にただ1つだけ作られます。
静的データメンバの値は、コンストラクタから参照することも、個々のオブジェクトから参照することも可能です。
静的データメンバは、プログラムの開始時に作成されます。
ただし、static付きの静的データメンバは、宣言時に初期化することができません。
作成された静的データメンバに初期値を与えてその実体を定義する場所は、ファイル有効範囲(クラス定義や関数定義の外)でなければいけません。
以下の Humanクラスは、データメンバとして
static int counter; // カウンタ(静的データメンバ)
int id_no; // 識別番号
std::string name; // 氏名
std::string country; // 国籍
double height; // 身長(cm)
double weight; // 体重(kg)
を持っています。
static付きで宣言されたデータメンバ int counter が、静的データメンバです。
静的データメンバは、 Humanクラス型の全てのオブジェクトで共有されます。
// Human.h
#include <string>
#include <iostream>
class Human {
private:
static int counter;
int id_no;
std::string name; // 氏名
std::string country; // 国籍
double height; // 身長(cm)
double weight; // 体重(kg)
public:
Human(std::string n, std::string c, double h, double w);
static int get_counter() { return counter; }
int id() const;
std::string namae() const { return name; }
std::string kokuseki() const { return country; }
double shinchou() const { return height; }
double taijuu() const { return weight; }
double bmi() const; // 肥満指数BMI
double standard_w() const; // 標準体重(kg)
};
inline std::ostream& operator<<(std::ostream& s, const Human& x) {
return s << "No." << x.id() << " 氏名:" << x.namae();
}
// Human.cpp
#include <iostream>
#include "Human.h"
int Human::counter = 0;
Human::Human(std::string n, std::string c, double h, double w)
: name(n), country(c), height(h), weight(w) {
id_no = ++counter;
}
int Human::id() const{ return id_no; }
double Human::bmi() const {
return weight / height / height * 10000;
}
double Human::standard_w() const {
return height * height * 22 / 10000;
}
// HumanTest.cpp
#include <iostream>
#include <string>
#include "Human.h"
using namespace std;
int main() {
Human saitou("斉藤とまと", "日本", 168.5, 55.0);
Human sakata("坂田メロン", "日本", 154.8, 50.5);
Human nakano("中野いちご", "日本", 161.0, 53.0);
cout << saitou << '\n';
cout << sakata << '\n';
cout << nakano << '\n';
cout << "現時点の counter値は " << Human::get_counter() << " です。\n";
}
この例では、コンストラクタが、++counter によってインクリメントされた counter値を、クラスオブジェクトの作成順に与えています。したがって、
最初に作成された saitouクラスは counter = 1
2番目に作られた sakataクラスは counter = 2
3番目に作られた nakanoクラスは counter = 3
になります。
これまでに何番までの識別番号が使われたのかを、静的データメンバ counter が保持してくれています。
static int counter
の実体は一つだけで、クラスオブジェクトが作られるたびにその値がインクリメントされます。そして、全てのクラスオブジェクトからその値を参照することができます。
上のプログラムで、静的データメンバ counter の値を参照するメンバ関数は、
static int get_counter() { return counter; }
です。
static付きの関数は、静的メンバ関数と呼ばれます。静的メンバ関数も、静的データメンバと同じで、クラスオブジェクト全体で共有します。
--
この記事へのコメント
コメントを書く
この記事へのトラックバックURL
https://fanblogs.jp/tb/6929294
※ブログオーナーが承認したトラックバックのみ表示されます。
この記事へのトラックバック