對工作分派和初始化
預設工作分派和初始設定方法分別是 「 成員指派 」 與 「 成員初始化,"。 對工作分派開始將一個物件複製到其他] 下,一次成員彷彿個別指派每個成員。 成員的初始化包含將一個物件複製到其他] 下,一次成員彷彿分別初始化每一個成員。 這兩個主要的差別是成員的工作分派會叫用每個成員的設定運算子 (operator=),而成員初始設定會叫用的每個成員的複製建構函式。
對工作分派被作業的指派運算子的形式宣告:
type**&** type :: operator=( [const | volatile] type**&** )
無法產生預設指派運算子,對工作分派,如果有下列情況皆存在:
成員的類別有 const 成員。
成員的類別都具有參考成員。
成員的類別或其基底類別有私用的工作分派運算子 (operator=)。
基底類別或成員的類別有沒有設定運算子 (operator=)。
無法產生預設複製建構函式成員的初始設定的如果類別或其基底類別的私用的複製建構函式,或者如果有下列情況皆存在:
成員的類別有 const 成員。
成員的類別都具有參考成員。
成員的類別或其基底類別有私用的複製建構函式。
基底類別或成員的類別有沒有複製建構函式。
預設設定運算子和指定之類別的複製建構函式一定會宣告,但它們尚未被定義除非下列情況皆成立:
類別中沒有提供此複本的使用者定義函式。
程式所需要的函式會出現。 如果工作分派或初始化時發生,需要對複製,或如果有這項要求的位址,此類別的**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)、 Account子物件的checking複製到account。 fOverdraftProtect不會複製。