https://youtu.be/VotOK_-zb5A

\textcolor{pink}{四国めたん: }教師役ですわ

\textcolor{lime}{ずんだもん: }生徒役なのだ
\footnotesize \textcolor{pink}{四国めたん:} こんにちは。四国めたんです
\footnotesize \textcolor{lime}{ずんだもん:} ずんだもんなのだ。こんにちはなのだ
\footnotesize \textcolor{pink}{四国めたん:} 今回は クラス の概要についてお話ししますわ
\footnotesize \textcolor{lime}{ずんだもん:} クラス ?
\footnotesize \textcolor{pink}{四国めたん:} はい、C++言語のメインともいえる仕組みですわね
\footnotesize \textcolor{lime}{ずんだもん:} なるほど、さっそくお願いするのだ
クラスはC++の目玉です
\footnotesize \textcolor{pink}{四国めたん:} 前回はC++言語で「Hello World!!」を出力するプログラムを紹介しましたわ
\footnotesize \textcolor{lime}{ずんだもん:} 基本となる部分はC言語の場合とほとんど変わっていなかったのだ
\footnotesize \textcolor{pink}{四国めたん:} はい、ファイルの拡張子を"cpp"としたり、コンソールへ出力する方法が変わったりしていましたわ
\footnotesize \textcolor{lime}{ずんだもん:} あと、インクルードファイルのファイル名や 名前空間 のこともふれたのだ
\footnotesize \textcolor{pink}{四国めたん:} 今回からは、C++言語の目玉ともいえる クラス について、何回かに分けて話していきますわ
\footnotesize \textcolor{lime}{ずんだもん:} よろしくお願いするのだ
クラスを伴ったC言語?
\footnotesize \textcolor{pink}{四国めたん:} 実は、C++言語が提唱された当初は C with Classes(クラスを伴ったC言語) という名前で呼ばれていましたわ
\footnotesize \textcolor{lime}{ずんだもん:} クラス を伴った?
\footnotesize \textcolor{pink}{四国めたん:} はい、それくらい クラス はC++言語にとって重要な仕組みなのですわ
\footnotesize \textcolor{lime}{ずんだもん:} なるほどなのだ
\footnotesize \textcolor{pink}{四国めたん:} その後、 C with Classes には様々な機能が追加され、名前も C++ と変わりましたわ
\footnotesize \textcolor{lime}{ずんだもん:} どういう意味なのだ?
\footnotesize \textcolor{pink}{四国めたん:} まぁ、意味としては「C言語をインクリメント(++)した言語」という感じでしょうか?
クラスの定義はこんな感じ
\footnotesize \textcolor{lime}{ずんだもん:} さっそく クラス の定義を教えて欲しいのだ
\footnotesize \textcolor{pink}{四国めたん:} わかりましたわ
\footnotesize \textcolor{pink}{四国めたん:} まず、 クラス には多くのことを書くことができますわ
\footnotesize \textcolor{lime}{ずんだもん:} かんたんに教えてもらうことはできないのか?
\footnotesize \textcolor{pink}{四国めたん:} まぁ、いちどに クラス の定義を行うのは難しい面がありますわね
\footnotesize \textcolor{pink}{四国めたん:} ですので、今回は簡素化した定義を行い、以降、少しずつ付け加えていきますわ
\footnotesize \textcolor{lime}{ずんだもん:} わかったのだ
\footnotesize \textcolor{pink}{四国めたん:} まず、基本となる定義がこれですわ
class クラス名 {
アクセス指定子:
メンバー1;
メンバー2;
:
:
};
\footnotesize \textcolor{lime}{ずんだもん:} う~ん、わかったような、わからないような…
\footnotesize \textcolor{pink}{四国めたん:} まぁ、これだけでは良くわからないので、実際にプログラムを作ってみましょう
#include <iostream>
/// @brief 円
class Circle {
public:
double diameter_; // 直径
};
int main(int argc, char* argv[]) {
Circle c = {10.0};
std::cout << "円の直径は" << c.diameter_ << "cmです。" << std::endl;
return 0;
}

\footnotesize \textcolor{lime}{ずんだもん:} 「円の直径は10cmです。」と表示されたのだ
Circleクラスの説明です
\footnotesize \textcolor{pink}{四国めたん:} まず、class Circle
以下がCircle
クラスの定義ですわ
\footnotesize \textcolor{lime}{ずんだもん:} 定義ではpublic:
とか"diameter_"などが書かれているのだ
\footnotesize \textcolor{pink}{四国めたん:} それぞれについて、もう少し詳しく説明していきますわね
アクセス指定子でアクセス制限します
\footnotesize \textcolor{pink}{四国めたん:} まず、最初のpublic:
は アクセス指定子 ですわ
\footnotesize \textcolor{lime}{ずんだもん:} アクセス指定子?
\footnotesize \textcolor{pink}{四国めたん:} はい、 アクセス指定子 は3種類が存在しますわ
- public: 制限なし
- protected: 一部制限
- private: 制限
\footnotesize \textcolor{lime}{ずんだもん:} 制限?
\footnotesize \textcolor{pink}{四国めたん:} はい、 アクセス指定子 を指定した以降のメンバーは、アクセス、つまり代入や参照に制限がかかるのですわ
\footnotesize \textcolor{pink}{四国めたん:} なお制限内容の詳細については、少しずつお話しして行きますわね
\footnotesize \textcolor{lime}{ずんだもん:} わかったのだ
\footnotesize \textcolor{pink}{四国めたん:} とりあえず今は制限がある場合、つまりprotected:
やprivate:
以下のメンバーにはダイレクトにアクセスできないと思っておいてください
\footnotesize \textcolor{lime}{ずんだもん:} なるほど、public:
以外は自由にアクセスできなくなるのか
\footnotesize \textcolor{pink}{四国めたん:} その通りですわ
\footnotesize \textcolor{lime}{ずんだもん:} プログラム例では最初にpublic:
の指定があるので、"diameter_"には制限がかからないのだ
メンバ変数を宣言します
\footnotesize \textcolor{pink}{四国めたん:} 次に メンバ変数 についてお話ししますわ
\footnotesize \textcolor{lime}{ずんだもん:} メンバ変数 ?
\footnotesize \textcolor{pink}{四国めたん:} はい、クラス内では、様々な型のデータを保持することが可能ですわ
\footnotesize \textcolor{pink}{四国めたん:} そのために変数とその型を宣言しますわ
\footnotesize \textcolor{lime}{ずんだもん:} プログラム例のdouble diameter_;
の部分が該当するのだ
\footnotesize \textcolor{pink}{四国めたん:} これらを メンバ変数 と呼びますわ
\footnotesize \textcolor{lime}{ずんだもん:} メンバ変数 には、どのような型を指定できるのだ?
\footnotesize \textcolor{pink}{四国めたん:} 一般的な変数と同じく、double
以外にもint
などの整数や構造体、列挙体、そしてクラスについても指定することができますわ
\footnotesize \textcolor{lime}{ずんだもん:} ポインタも指定できるのか?
\footnotesize \textcolor{pink}{四国めたん:} そうですわね
\footnotesize \textcolor{lime}{ずんだもん:} ところで メンバ変数 の名前については制限があるのか?
\footnotesize \textcolor{pink}{四国めたん:} 慣習としてスネークケース、つまり小文字の英数字とアンダースコア"_"のみを使用しますわね
\footnotesize \textcolor{pink}{四国めたん:} また、最後にアンダースコア"_"を付けるのも習わしですわ
\footnotesize \textcolor{lime}{ずんだもん:} わかったのだ
Circleクラスの変数の宣言を行います
\footnotesize \textcolor{pink}{四国めたん:} 次にメイン関数内でのCircle
クラスの変数の宣言と初期化についてお話ししますわ
\footnotesize \textcolor{lime}{ずんだもん:} お願いするのだ
\footnotesize \textcolor{pink}{四国めたん:} C言語では、構造体などの変数を宣言する場合、struct 構造体名 変数名;
のように、構造体名の前にstruct
というキーワードが必要でしたわ
\footnotesize \textcolor{lime}{ずんだもん:} 覚えているのだ
\footnotesize \textcolor{pink}{四国めたん:} C++言語では、そのようなキーワードは必要とせず、単に構造体名 変数名;
で宣言可能となりましたわ
\footnotesize \textcolor{lime}{ずんだもん:} お~、便利なのだ
\footnotesize \textcolor{pink}{四国めたん:} 当然ですが、クラスの変数を宣言する場合もclass
などのキーワードは必要とせず、クラス名 変数名;
でOKですわ
\footnotesize \textcolor{lime}{ずんだもん:} なるほどなのだ
\footnotesize \textcolor{lime}{ずんだもん:} ということは、わざわざtypedef
を使って 型 を定義する必要がなくなったのだ
\footnotesize \textcolor{pink}{四国めたん:} その通りですわ
\footnotesize \textcolor{pink}{四国めたん:} ちなみに、C++言語ではクラスの変数を オブジェクト もしくは インスタンス と呼びますわ
オブジェクトとインスタンス
オブジェクト と インスタンス は、C++言語では概ね同じと考えて問題ないと思います
厳密には異なるものなのですが、人によって解釈に幅があるようです
一般的には、 インスタンス は オブジェクト に含まれるという解釈が通説になっているみたいです
最近は、クラスから作られた実体、つまり変数などについては インスタンス と呼ぶのが流行りみたいです
Circleクラスのインスタンスの初期化
\footnotesize \textcolor{pink}{四国めたん:} Circle
クラスの宣言のあとは初期化ですわ
\footnotesize \textcolor{lime}{ずんだもん:} プログラム例では"="の後に初期化の値を波括弧"{}"でくくって列挙しているのだ
\footnotesize \textcolor{pink}{四国めたん:} はい、このあたりは構造体と一緒ですわね
Circleクラスのインスタンスのメンバ変数へのアクセス
\footnotesize \textcolor{pink}{四国めたん:} Circle
クラスとして宣言された インスタンス 中の メンバ変数 の値を取得したり、値を設定するためには、 ドット演算子 "."を使用しますわ
\footnotesize \textcolor{lime}{ずんだもん:} プログラム例ではコンソールへの出力部分でのc.diameter_
が該当するのだ
\footnotesize \textcolor{pink}{四国めたん:} そうですわね
\footnotesize \textcolor{pink}{四国めたん:} このへんも構造体と一緒ですわ
構造体と同じですか?
\footnotesize \textcolor{lime}{ずんだもん:} ここまで見て来ると、クラスと構造体は似ている、と云うか「同じ」なのではないか?
\footnotesize \textcolor{pink}{四国めたん:} はい、実はC++言語では、 クラス と 構造体 は概ね同じように扱うことができますわ
\footnotesize \textcolor{pink}{四国めたん:} 実際、プログラム例で クラス を 構造体 に変えても、問題なく動作しますわ
#include <iostream>
/// @brief 円
struct Circle {
public:
double diameter_; // 直径
};
int main(int argc, char* argv[]) {
Circle c = {10.0};
std::cout << "円の直径は" << c.diameter_ << "cmです。" << std::endl;
return 0;
}

\footnotesize \textcolor{lime}{ずんだもん:} 出力が同じになっているのだ
\footnotesize \textcolor{lime}{ずんだもん:} ところで 構造体 にpublic:
は必要なのか?
\footnotesize \textcolor{pink}{四国めたん:} 通常は必要ありませんが、今回は クラス と 構造体 が、同じように使えることを示すために、敢えて残していますわ
\footnotesize \textcolor{lime}{ずんだもん:} りょうかいなのだ
クラスと構造体の違いは何ですか?
\footnotesize \textcolor{lime}{ずんだもん:} ところで クラス と 構造体 の違いは何なのだ?
\footnotesize \textcolor{lime}{ずんだもん:} 全く同じであれば、敢えて クラス なんて導入する必要性はないのではないか?
\footnotesize \textcolor{pink}{四国めたん:} はい、実は クラス と 構造体 は、 アクセス指定子 でアクセス制限を行わなかった場合の デフォルト の動作が異なっていますわ
\footnotesize \textcolor{lime}{ずんだもん:} どういうことなのだ?
\footnotesize \textcolor{pink}{四国めたん:} まず 構造体 ではC言語と同様にメンバーへのアクセスはフリーに行えますわ
\footnotesize \textcolor{lime}{ずんだもん:} つまりpublic:
を指定したのと同じと云うことか...
\footnotesize \textcolor{pink}{四国めたん:} 一方 クラス ではメンバーへのアクセスは完全に制限されていますわね
\footnotesize \textcolor{lime}{ずんだもん:} つまりprivate:
を指定したのと同じと云うことか...
\footnotesize \textcolor{pink}{四国めたん:} はい、確認のために最初のプログラム例で クラス から アクセス指定子 を外してみましょう
#include <iostream>
/// @brief 円
class Circle {
double diameter_; // 直径
};
int main(int argc, char* argv[]) {
Circle c = {10.0};
std::cout << "円の直径は" << c.diameter_ << "cmです。" << std::endl;
return 0;
}


\footnotesize \textcolor{lime}{ずんだもん:} むっ、初期化による代入やドット演算子"."によるメンバ変数へのアクセス部分でエラーになっているのだ
\footnotesize \textcolor{pink}{四国めたん:} はい、これはクラスのメンバーへのデフォルトのアクセス制限がprivate:
になっているためですわ
\footnotesize \textcolor{lime}{ずんだもん:} なるほどなのだ
\footnotesize \textcolor{pink}{四国めたん:} 当然、 構造体 であれば、デフォルトのアクセス制限がpublic:
になっているので、問題なく実行できますわ
#include <iostream>
/// @brief 円
struct Circle {
double diameter_; // 直径
};
int main(int argc, char* argv[]) {
Circle c = {10.0};
std::cout << "円の直径は" << c.diameter_ << "cmです。" << std::endl;
return 0;
}

\footnotesize \textcolor{lime}{ずんだもん:} お~、問題なく実行できたのだ
クラスと構造体、どちらを使う?
結局、 クラス と 構造体 のどちらを使えば良いのでしょうか?
どちらも概ね同じ機能を提供するので、基本的には クラス を使えばいいと思います
クラス に付随する機能を実現するために、わざわざ クラス を定義したのですから...
まとめ
\footnotesize \textcolor{pink}{四国めたん:} クラスの初歩 については以上となりますわ
\footnotesize \textcolor{lime}{ずんだもん:} おつかれさまなのだ
\footnotesize \textcolor{pink}{四国めたん:} お疲れさまでした
Discussion