멤버 수준 할당 및 초기화
기본 할당 및 초기화 방법 각각 "멤버 수준 할당" 및 "분할 초기화"입니다.멤버 수준 배정에 개체는 다른 구성원을 복사의 각 멤버에 개별적으로 할당 하는 것 처럼 됩니다.멤버 수준 초기화 개체는 다른 구성원을 복사의 각 멤버를 개별적으로 초기화 하는 것 처럼 이루어집니다.둘 사이의 주요 차이점은 각 구성원의 할당 연산자를 호출 하는 멤버 수준 할당 됩니다 (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복사 되지 않습니다.