topazの遊び場

いろいろやってみる

そろそろC++やるぞパート6 クラス入門3

そろそろC++やります

そろそろC++をやります。そろそろC++をやりたいからです。
何回やるかはわかりません。基礎を理解するまではやろうと思います。

という感じでやっています。

※ 初心者がメモレベルで記録するので、技術記事としてはお力になれないかもしれません。

内容

  • 前回クラスについて勉強して、member-list だけ残しておいたので、続きのmember-listを行います。

メンバーの概要

  • メンバーの初期化はコンストラクタで行います。
  • C++ 11 以降では宣言時に初期化でき、通常はそうするべきです。
  • メモリの解放やリソースの解放などはデストラクタで行います。

特殊なメンバー関数

特殊なメンバー関数は、コンパイラが自動生成するクラスメンバー関数です。

これらが特殊メンバー関数で、定義されていない場合、コンパイラが関数を暗黙的に宣言して定義することがあります。コンストラクターやデストラクターを書かなくても動作するのは自動生成してくれているおかげです。
コンパイラによって生成される関数を、規定の特殊メンバー関数(default special member functions)と呼びます。コンパイラが生成するので、コードの自動生成の用に手元のコードに変更が加わるわけではありません。
必要のない場合はコンパイラは定義しません。

コピーコンストラクとは?と気になるところですが、これはまた今度コンストラクタでまとめたときに考えてることにします。(少し見たところ長くなりそうでした)

メンバー関数

メンバー関数は静的な関数と非静的な関数に分かれます。これらはクラスの内、外に定義することができます。

class Writer
{
public:
    static void PrintA()
    {
        cout << "A" << endl;
    };
    void PrintB()
    {
        cout << "B" << endl;
    };
    static void PrintC();
    void PrintD();
};

inline void Writer::PrintC()
{
    cout << "C" << endl;
};

inline void Writer::PrintD()
{
    cout << "D" << endl;
};
  • PrintA: 静的な関数で、クラス内に定義された関数
  • PrintB: 非静的な関数で、クラス内に定義された関数
  • PrintC: 静的な関数で、クラス外に定義された関数
  • PrintD: 非静的な関数で、クラス外に定義された関数

メンバー関数がクラス宣言({ })の中で定義されている場合はインライン関数と扱われ、クラス名で関数を修飾する必要がありません。

メンバーごとの初期化

今までのメンバーの初期化はコンストラクタで行っていました。

class Vector2
{
private:
    int x;
    int y;
    // コンストラクタで初期化
    Vector2() : x(0), y(0)
    {
    }
};

ところが、C++11以降では非静的メンバーの宣言子に初期化子を含めることができます。こちらにはこのような例が載せられていました。

class CanInit
{
public:
    long num {7};       // OK in C++11
    int k = 9;          // OK in C++11
    static int i = 9; // Error: must be defined and initialized
                      // outside of class declaration.

    // initializes num to 7 and k to 9
    CanInit(){}

    // overwrites original initialized value of num:
    CanInit(int val) : num(val) {}
};

変数numkが初期化されています。それぞれ初期化の方法が異なり、値の初期化コピーの初期化と呼ばれています。

// 値の初期化
long num {7};    
// コピーの初期化
int k = 9;

初期化は他にもいくつかあるので、また今度見てみたいと思います。

参考リンク

感想

クラスの変数や関数は、クラス内に書いた方がカプセル化が見やすくて、分かりやすい気がしていて、インライン関数の良さがあまりわかっていない状態です。ヘッダーファイルなどに触れて後々、インライン機能のありがたさに気づきたいところです。

次回は配列について、どのようなものか見ていきたいと思います。