C ++ 11の新機能=削除および=デフォルト

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

おすすめ

転載: blog.csdn.net/wowocpp/article/details/114255645