🖥️

【C++言語入門】 第2回 クラスの初歩

2025/02/13に公開

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;
}

実行結果2

\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;
}

実行結果3

\footnotesize \textcolor{lime}{ずんだもん:} お~、問題なく実行できたのだ

クラスと構造体、どちらを使う?

結局、 クラス構造体 のどちらを使えば良いのでしょうか?

どちらも概ね同じ機能を提供するので、基本的には クラス を使えばいいと思います

クラス に付随する機能を実現するために、わざわざ クラス を定義したのですから...

まとめ

\footnotesize \textcolor{pink}{四国めたん:} クラスの初歩 については以上となりますわ

\footnotesize \textcolor{lime}{ずんだもん:} おつかれさまなのだ

\footnotesize \textcolor{pink}{四国めたん:} お疲れさまでした

Discussion