テレビクラス |
電源の状態 現在のチャンネル 現在の音量 |
電源ON/OFF チャンネル変更 音量調節 |
テレビクラス |
電源の状態 現在のチャンネル 現在の音量 |
現在の電源状態取得 現在のチャンネル状態取得 現在の音量状態取得 電源ON/OFF チャンネル変更 音量調節 現在の状態をコンソール表示 |
#include <iostream> using namespace std; class Television { // データメンバ int power; int channel; int volume; public: Television(); ~Television(); // 状態取得用のメンバ関数 int getPower(); int getChannel(); int getVolume(); // 状態設定用のメンバ関数 void setPower(int p); void setChannel(int c); void setVolume(int v); // 状態表示用のメンバ関数 void printStatus(); }; Television::Television() { power = 0; // 電源オフ channel = 1; // チャンネル1。首都圏では NHK volume = 0; // ボリューム0 } Television::~Television() { } // 値の取得用関数 (getter) 3つ int Television::getPower() { return power; } int Television::getChannel() { return channel; } int Television::getVolume() { return volume; } // 値の設定用関数 (setter) 3つ void Television::setPower(int p) { power = p; } void Television::setChannel(int c) { channel = c; } void Television::setVolume(int v) { volume = v; } void Television::printStatus() { if(power == 1) { cout << "電源はオンです。"; } else { cout << "電源はオフです。"; } cout << "チャンネルは" << channel << "です。"; cout << "ボリュームは" << volume << "です。\n"; } int main(void) { Television tv; // Television クラスの変数 tv を宣言 // クラスを「新しい型」として用いている // この時点でコンストラクタが呼ばれる tv.printStatus(); // 確認のために状態表示 tv.setPower(1); // 電源オン tv.setChannel(8); // 8チャンネルにセット tv.setVolume(10); // ボリュームを10に tv.printStatus(); tv.setChannel(4); // 4チャンネルにセット tv.printStatus(); }今回も、paiza.IO のプログラムを全て差し替える形となっている。
電源はオフです。チャンネルは1です。ボリュームは0です。 電源はオンです。チャンネルは8です。ボリュームは10です。 電源はオンです。チャンネルは4です。ボリュームは10です。この出力の意味を理解できるよう以下で解説を行う。
class Television { // データメンバ int power; int channel; int volume; public: Television(); ~Television(); // 状態取得用のメンバ関数 int getPower(); int getChannel(); int getVolume(); // 状態設定用のメンバ関数 void setPower(int p); void setChannel(int c); void setVolume(int v); // 状態表示用のメンバ関数 void printStatus(); };まず、冒頭に「class Television」と書かれていることから、テレビクラスには「Television」というクラス名が付けられていることがわかる。
テレビクラス |
電源の状態 現在のチャンネル 現在の音量 |
現在の電源状態取得 現在のチャンネル状態取得 現在の音量状態取得 電源ON/OFF チャンネル変更 音量調節 現在の状態をコンソール表示 |
メンバ関数名 | 名前 | 説明 |
Television() | コンストラクタ | オブジェクトが生成されるときに自動的に呼ばれる。クラス名と同じ名前で戻り値を持たない特別な関数。 |
~Television() | デストラクタ | オブジェクトが破棄ときに自動的に呼ばれる。クラス名に ~ をつけた名前で戻り値を持たない特別な関数。 |
Television::Television() { power = 0; // 電源オフ channel = 1; // チャンネル1。首都圏では NHK volume = 0; // ボリューム0 } Television::~Television() { } // 値の取得用関数 (getter) 3つ int Television::getPower() { return power; } int Television::getChannel() { return channel; } int Television::getVolume() { return volume; } // 値の設定用関数 (setter) 3つ void Television::setPower(int p) { power = p; } void Television::setChannel(int c) { channel = c; } void Television::setVolume(int v) { volume = v; } void Television::printStatus() { if(power == 1) { cout << "電源はオンです。"; } else { cout << "電源はオフです。"; } cout << "チャンネルは" << channel << "です。"; cout << "ボリュームは" << volume << "です。\n"; }このうち、以下のコンストラクタ内では初期状態として「電源オフ (power=0;)」、「チャンネル (channel=1;)」、「ボリューム (volume=0;)」で初期化している。
Television::Television() { power = 0; // 電源オフ channel = 1; // チャンネル1。首都圏では NHK volume = 0; // ボリューム0 }この初期化が何を意味するかというと、プログラムで初めてTelevisionクラスを使う際、電源がオフ、チャンネルが1、ボリュームが0の状態にしておく、ということである。
void Television::printStatus(){ if(power == 1) { cout << "電源はオンです。"; } else { cout << "電源はオフです。"; } cout << "チャンネルは" << channel << "です。"; cout << "ボリュームは" << volume << "です。\n"; }何をしているかというと、現在の Television クラスの状態、すなわち変数 power、channel、volume の状態をコンソールに表示するのである。
電源はオフです。チャンネルは1です。ボリュームは0です。 電源はオンです。チャンネルは8です。ボリュームは10です。 電源はオンです。チャンネルは4です。ボリュームは10です。では、 printStatus 関数はどこで3回実行されているのだろうか。
int main(void) { Television tv; // Television クラスの変数 tv を宣言 // クラスを「新しい型」として用いている // この時点でコンストラクタが呼ばれる tv.printStatus(); // 確認のために状態表示 tv.setPower(1); // 電源オン tv.setChannel(8); // 8チャンネルにセット tv.setVolume(10); // ボリュームを10に tv.printStatus(); tv.setChannel(4); // 4チャンネルにセット tv.printStatus(); }オブジェクト指向プログラミングでは main 関数は作成したクラスを動作させるために使われることが多い。
電源はオフです。チャンネルは1です。ボリュームは0です。 電源はオンです。チャンネルは8です。ボリュームは10です。 電源はオンです。チャンネルは4です。ボリュームは10です。以上を見ると、main 関数で Television クラスの変数 tv を操作することは、本物のテレビをリモコン操作することに似ていることに気づくだろう。