クラスの基本テンプレート

 c++ のクラスは、基本的に必要とするコンストラクタやメンバー関数がいろいろあります。
加えて "自動的に作成される特殊メンバ関数" なんてものがあり、さらに面倒なことに自動的に生成されるルールがあるため、自動生成されたり、自動生成されなかったりします。正直、お手本のソースコードでも用意しておかないと難しい内容です。

 ここでは c++ の class の雛形を用意して、これをもとにして必要な修正を行うだけである程度のコーディングを行えるようにすることを目指します。

目次

1. 単純なテンプレート
2. ***
3. ***

 

1. 単純なテンプレート

[概要]

一番シンプルであろうテンプレートを以下に示します。
今更 c++98 もないと思うので c++11 を前提に、まずは default 指定で全て記載した例を示します。
"自動的に作成される特殊メンバ関数" を全て default 指定しているので、自動的に作成されるメンバ関数はありません。

 

[評価環境]

コンパイラ : Visual Studio 2019 pro., Version 16.4.0
OS: Windows10 home, Version 1909

 

[プログラムソース "class_template_01.cpp"]

#include <utility>  // std::move

class Base {
public:
    Base() = default;                               // default constructor
    virtual     ~Base() = default;                  // destructor

    Base(const Base&) = default;                    // copy constructor
    Base& operator = (const Base&) = default;       // copy operator

    Base(Base&&) = default;                         // move constructor
    Base& operator = (Base&&) = default;            // move operator
};

int main()
{
    Base b1;                // call 'default constructor'.
    Base b2(b1);            // call 'copy constructor'.
    Base b3 = b2;           // call 'copy constructor'.
    Base b4(Base());        // call 'move constructor'.
    Base b5 = Base();       // call 'move constructor'.
    
    Base b6;
    b6 = b1;                // call 'copy operator'.
    Base b7;
    b7 = std::move(b1);     // call 'move operator'.
}

 

使用例

[プログラムソース "class_template_02.cpp"]

#include <iostream> // std::cout, std::endl
#include <string>   // std::string
#include <utility>  // std::move

class Base {
private:
    std::string     str_;
    
public:
    Base() = default;                               // default constructor

    Base(std::string str)
        : str_(str)
    {}

    virtual     ~Base() = default;                  // destructor

    Base(const Base&) = default;                    // copy constructor
    Base& operator = (const Base&) = default;       // copy operator

    Base(Base&&) = default;                         // move constructor
    Base& operator = (Base&&) = default;            // move operator

    void set_str(std::string str)
    {
        str_ = str;
    }

    void print_str(std::string item)
    {
        std::cout << item << "str_ = " << str_ << std::endl;
    }
};


int main()
{
    Base b1;                        // call 'default constructor'.
    b1.print_str("[b1] ");
    b1.set_str("b1");
    b1.print_str("[b1] ");
    std::cout << std::endl;

    Base b2(b1);                    // call 'copy constructor'.
    b2.print_str("[b2] ");
    std::cout << std::endl;

    Base b3 = b1;                   // call 'copy constructor'.
    b3.print_str("[b3] ");
    std::cout << std::endl;

    // Base b4(Base());             // これは VS Version 16.4.0 ではエラー。
    Base b4{ Base() };              // call 'move constructor'.    
    // Base b4(std::move(Base());   // これもOK。
    b4.print_str("[b4] ");
    std::cout << std::endl;

    Base b5 = Base("b5");           // call 'move constructor'.
    b5.print_str("[b5] ");
    std::cout << std::endl;

    Base b6;
    b6.set_str("b6");
    b6.print_str("[b6] ");
    Base b7 = std::move(b6);        // call 'move constructor'.
    b7.print_str("[b7] ");
    b6.print_str("[b6] ");
    std::cout << std::endl;

    Base b8;
    b8 = b1;                        // call 'copy operator'.
    b8.print_str("[b8] ");
    b1.print_str("[b1] ");
    std::cout << std::endl;

    Base b9;
    b9 = std::move(b1);             // call 'move operator'.
    b9.print_str("[b9] ");
    b1.print_str("[b1] ");
}

 

[実行結果]

 

 

参考

 

 

2. ***

[概要]

 

[環境]

 

[プログラムソース "***.cpp"]



	


サンプルプログラム

サンプルプログラム ダウンロード

 

参考

 


記載: