この章では、C++でオブジェクト指向プログラミングの基本となる「クラス」について学びます。
クラスは「設計図」です。
C++で最もシンプルなクラスの例として、次のような形からスタートできます。まずは読めるようになることを目指してください。
#include <iostream>
using namespace std;
// クラスの定義
class Greeting {
public:
void sayHello() {
cout << "Hello, World!" << endl;
}
};
int main() {
Greeting g; // クラスからオブジェクトを作成
g.sayHello(); // メンバ関数を呼び出し
return 0;
}
class Greeting { ... }; で Greeting という型(設計図) を作成sayHello() は Greeting型の 機能(メンバ関数)Greeting g; で Greeting型の オブジェクト(実体) を作成g.sayHello(); でオブジェクトの機能を実行このように、クラスは型を作り、オブジェクトはその型の実体という関係になります。
#include <iostream>
using namespace std;
// クラスの定義
class Student {
public:
string name;
int score;
void show() {
cout << name << " の点数は " << score << " 点です。" << endl;
}
};
int main() {
// クラスからオブジェクトを作成
Student s;
s.name = "Tanaka";
s.score = 80;
s.show(); // メンバ関数を呼び出し
return 0;
}
class クラス名 { ... }; でクラスを定義public: で公開メンバ(外からアクセス可能)を宣言string name と int score は メンバ変数(データ)void show() は メンバ関数(処理)Student s; で オブジェクト(実体) を作成s.name、s.score、s.show() でオブジェクトの機能を使うC++のクラスでは、メンバのアクセス範囲を指定できます。
| 修飾子 | アクセスできる範囲 | 用途 |
|---|---|---|
public |
どこからでも可 | 外部から使わせたい関数や変数 |
private |
クラス内部からのみ可 | 外部に見せたくないデータや内部処理 |
protected |
クラスとその派生クラスから可 | 継承先には公開したいが、外部からは隠したい場合 |
class Account {
private:
int balance;
public:
Account() {
balance = 0;
}
void deposit(int amount) {
balance += amount;
}
void show() {
cout << "残高: " << balance << "円" << endl;
}
};
このように、データを隠して操作だけを公開するのが基本的なクラス設計です。
オブジェクト指向の話をしていると「メソッド」という言葉を耳にすることがあります。C++ではあまり「メソッド」という言葉は使われず、代わりに「メンバ関数」と呼ぶのが一般的です。
// hello_class.cpp
#include <iostream>
using namespace std;
class Greeting {
public:
void sayHello() {
cout << "Hello, World!" << endl;
}
};
int main() {
Greeting g;
g.sayHello();
return 0;
}
Greeting から Student に変更するstring name と int score を追加するsayHello() を show() に変更し、名前と点数を表示するようにするcout << name << " の点数は " << score << " 点です。" << endl; のように出力できます。s.name = "Tanaka"; のようにメンバ変数に値を代入してから s.show(); を呼び出しましょう。
次のコードを実行すると何が表示されますか?
#include <iostream>
using namespace std;
class Book {
public:
string title;
void print() {
cout << "タイトル: " << title << endl;
}
};
int main() {
Book b;
b.title = "C++入門";
b.print();
return 0;
}
print() の中で "タイトル: " << title と出力しているので、「タイトル: C++入門」が表示されます。
クラスの説明として正しいものはどれですか?
クラス名 変数名; でオブジェクト(実体)を作ります。クラス自体はメモリを占有しません。
public: の説明として正しいものはどれですか?
public: で宣言されたメンバはクラスの外(main関数など)からも自由にアクセスできます。
次のコードはコンパイルエラーになります。その理由はどれですか?
class Item {
private:
int price;
};
int main() {
Item x;
x.price = 100; // ここがエラー
return 0;
}
private: で宣言されたメンバはクラスの外からアクセスできません。public: なメンバ関数を通じて操作する必要があります。
public で外からアクセス可能にする