c++ のクラスは、基本的に必要とするコンストラクタやメンバー関数がいろいろあります。
加えて "自動的に作成される特殊メンバ関数"
なんてものがあり、さらに面倒なことに自動的に生成されるルールがあるため、自動生成されたり、自動生成されなかったりします。正直、お手本のソースコードでも用意しておかないと難しい内容です。
ここでは c++ の class の雛形を用意して、これをもとにして必要な修正を行うだけである程度のコーディングを行えるようにすることを目指します。
1. 単純なテンプレート
2. ***
3. ***
[概要]
一番シンプルであろうテンプレートを以下に示します。
今更 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] ");
}
[実行結果]
[概要]
[環境]
[プログラムソース "***.cpp"]
サンプルプログラム ダウンロード
記載: