Memberwise の代入と初期化
既定の割り当てと初期化のメソッドはメンバーごと「」および 「メンバーごと初期化」です。Memberwise の割り当ては他に 1 個のオブジェクトメンバーを一度にコピーから各メンバーを個別に割り当てるように構成されています。Memberwise の初期化は他に 1 個のオブジェクトメンバーを一度にコピーから各メンバーを個別に初期化するように構成されています。2 との主な相違点はメンバーごとの初期化が各メンバーのコピー コンストラクターを呼び出す単一のメンバーごとに各メンバーの operator= 代入演算子 () を呼び出すことです。
Memberwise の割り当てはフォームで宣言された代入演算子に対してだけ実行されます :
type type :: (operator= [ 定数 |volatile 入力] type )
メンバーごとの既定の代入演算子は次のいずれかがの場合は生成できません :
メンバーのクラスに 定数 のメンバーがあります。
メンバーのクラスには参照のメンバーがあります。
メンバーのクラスまたは基本クラスにプライベート代入演算子 ()operator= があります。
基本クラスまたはメンバーのクラスは代入演算子 ()operator= はありません。
メンバーごとの初期化の既定のコピー コンストラクターは基本クラスのクラスまたは 1 はプライベート コピー コンストラクターが存在する場合は次の条件のいずれかがの場合は生成できません :
メンバーのクラスに 定数 のメンバーがあります。
メンバーのクラスには参照のメンバーがあります。
メンバーのクラスまたは基本クラスはプライベート コピー コンストラクターがあります。
基本クラスまたはメンバーのクラスはコピー コンストラクターがありません。
特定のクラスの既定のコンストラクターとコピー演算子は常に宣言されますが次の条件の両方に対して定義されていません :
クラスはコピーにユーザー定義関数を提供しません。
プログラムが関数を指定する必要があります。この要件のコピーを必要とするメンバーごとまたはクラスの operator= 関数のアドレスが多すぎるか初期化されるとの割り当てが含まれます。
両方の条件が満たされない場合コンパイラは既定の演算子とコピー コンストラクター関数のコードを生成する必要はありません (このようなコードの削除はMicrosoft C++ のコンパイラで実行する最適化されます。具体的には「 クラス名 への参照の引数を受け取るクラスがユーザー定義の operator= を宣言すると」既定の代入演算子は生成されません。クラスのコピー コンストラクターを宣言すると既定のコピー コンストラクターは生成されません。
したがって特定のクラスに A次の宣言は常にあります :
// Implicit declarations of copy constructor
// and assignment operator.
A::A( const A& );
A& A::operator=( const A& );
定義だけを必要に応じて決定されます (前の基準に従って)。前の例で示したコピー コンストラクター関数はクラスのパブリック メンバー関数と見なされます。
パブリックの基本クラス型のオブジェクトに割り当てる特定のクラスの既定の代入演算子のオブジェクト。次のコードがあるとします。
使用例
// spec1_memberwise_assignment_and_initialization.cpp
#include<stdio.h>
class Account
{
protected:
int _balance;
public:
int getBalance()
{
return _balance;
}
};
class Checking : public Account
{
private:
int _fOverdraftProtect;
public:
Checking(int balance, int fOverdraftProtect)
{
_balance = balance;
_fOverdraftProtect = fOverdraftProtect;
}
};
int main()
{
Account account;
Checking checking(1000, 1);
account = checking;
printf_s("Account balance = %d\n", account.getBalance());
}
コメント
前の例では選択された代入演算子は Account::operator= です。既定の operator= の関数が型 Account&Account への参照 () の引数を受け取るためchecking の Account のサブオブジェクトは account にコピー ; fOverdraftProtect はコピーされません。