では、を使用してメモリを割り当てる場合にのみ、new
ユーザー定義のコピー コンストラクターが必要になるのでしょうか?
静的配列またはを使用するとどうなりますかstd::string
? 静的配列全体std::string
がデフォルトのコピー コンストラクターによってコピーされますか?
ファイルポインタはどうですか?メモリはそこに割り当てられていません。
では、を使用してメモリを割り当てる場合にのみ、new
ユーザー定義のコピー コンストラクターが必要になるのでしょうか?
静的配列またはを使用するとどうなりますかstd::string
? 静的配列全体std::string
がデフォルトのコピー コンストラクターによってコピーされますか?
ファイルポインタはどうですか?メモリはそこに割り当てられていません。
リソースとは、明示的に取得および解放する必要があるものです。
リソースを管理するクラスには、通常、ユーザー定義のデストラクタが必要であり、その結果、ユーザー定義 (または削除) のコピー コンストラクターと代入演算子、および場合によっては移動操作も必要になります。
ただし、優れた設計では、「単一責任規則」が義務付けられています。これは、すべてのクラスが 1 つの責任を持つべきであり、それ以上の責任は持たないというものです。このルールを適用することは、リソースを管理することのみを責任とし、値または値のようなセマンティクスを外部に提示するクラスにリソースをラップすることを意味します。
リソース管理クラスを使用してファイルを開く例を次に示します。
if (auto fp = std::unique_ptr<FILE, int(*)(FILE*)>(std::fopen("/dev/null", "wb"),
std::fclose))
{
std::fwrite(buf, 1, sizeof buf, fp.get());
}
単一責任の原則の使用は、コードがlocalのままであることです。つまり、すべてのリソースに対して責任を持つコードが1行あります。複数あると、エラー処理と複数の出口点のために指数関数的に成長する分岐が発生することがよくあります。対照的に、単一の責任は、リソースごとに心配する必要がある場所が 1 つしかないことを意味します。