C ++ 11の新機能=削除および=デフォルト
差出人:http://www.wazhlh.com/?post = 7
C ++クラスには、デフォルトコンストラクタ、デストラクタ、コピーコンストラクタ、およびコピー割り当て演算子の4種類の特別なメンバー関数があります。
1.クラスのデフォルト関数
デフォルトのコンストラクタ
デフォルトのデストラクタ
デフォルトのコピーコンストラクタ
デフォルトのコピー割り当て関数
デフォルトの移動コンストラクタ
デフォルトの移動割り当て関数
2.クラス内のカスタム操作関数
operator
operator&
operator &&
operator *
operator->
operator-> *
operator new
operator delete
[= default]キーワード
C ++は、クラスがこれらの関数のカスタムバージョンを実装すると、コンパイラがデフォルトバージョンを自動的に生成しないことを規定しています。デフォルトバージョンは自動生成されないことに注意してください。もちろん、デフォルトバージョンは手動で生成できます。コンストラクターをパラメーター付きで定義する場合、パラメーターなしのバージョンを宣言して、パラメーターなしの変数の初期化を完了するのが最適です。この時点で、コンパイラーはパラメーターなしのデフォルトバージョンを自動的に提供しなくなります。キーワードdefaultを使用してデフォルトコンストラクターの生成を制御し、関数のデフォルトバージョンを生成するようにコンパイラーに明示的に指示できます。例えば:
class Preson
{
public:
Preson(int a);
~Preson();
};
Preson A; // 就会报错 类不存在默认的构造函数
注:デフォルトのコンストラクター、コピーおよび移動コンストラクター、コピーおよび移動コピー演算子およびデストラクタにのみ表示できます
class Preson
{
public:
Preson() = default;
Preson(int a);
~Preson();
};
Preson A; // ok
[=削除]キーワード
デフォルト関数の生成を制限したい場合があります。通常、コピーコンストラクターの使用は禁止されています。過去の慣例では、コピーコンストラクターをプライベートとして宣言し、実装を提供しないため、オブジェクトがコピーされたときにコンパイルに合格できず、C ++ 11はdeleteキーワードを使用してコンパイラに明示的に指示する関数のデフォルトバージョンは生成されません。
class Preson
{
public:
Preson() = default;
Preson(int a) = delete;
~Preson();
};
Preson a; // ok
Preson b = new Preson(10); // err 无法引用 Preson::Preson(int a)
注:C ++ 11では、deleteキーワードは、クラスメンバー関数だけでなく、任意の関数で使用できます。
class Preson
{
public:
Preson() = default;
Preson(int a) = delete;
~Preson();
void sayHello(int a) = delete;
void sayHello(char a);
void sayHello(std::string a) = delete;
};
Preson* p = new Preson();
p->sayHello(10); // err
p->sayHello('a'); // ok
p->sayHello("hello"); // err