멤버 수준 할당 및 초기화
기본 할당 및 초기화 방법은 "멤버 수준 할당"과 "멤버 수준 초기화"입니다. 멤버 수준 할당은 각 멤버를 개별적으로 할당하는 것처럼 한 번에 멤버 하나씩 한 개체를 다른 개체로 복사하는 방식입니다. 멤버 수준 초기화는 각 멤버를 개별적으로 초기화하는 것처럼 한 번에 멤버 하나씩 한 개체를 다른 개체로 복사하는 방식입니다. 두 할당의 주된 차이는 멤버 수준 할당이 각 멤버의 대입 연산자(operator=)를 호출하고 멤버 수준 초기화는 각 멤버의 복사 생성자를 호출한다는 점입니다.
다음 형식으로 선언된 대입 연산자에 의해서만 멤버 수준 할당이 수행됩니다.
type**&** type :: operator=( [const | volatile] type**&** )
다음 조건 중 하나라도 있으면 멤버 수준 할당의 기본 대입 연산자를 생성할 수 없습니다.
멤버 클래스에 const 멤버가 있습니다.
멤버 클래스에 참조 멤버가 있습니다.
멤버 클래스 또는 기본 클래스에 전용 대입 연산자(operator=)가 있습니다.
기본 클래스 또는 멤버 클래스에 대입 연산자(operator=)가 없습니다.
클래스 또는 기본 클래스 중 하나에 전용 복사 생성자가 없거나 다음 조건 중 하나라도 있으면 멤버 수준 초기화의 기본 복사 생성자를 생성할 수 없습니다.
멤버 클래스에 const 멤버가 있습니다.
멤버 클래스에 참조 멤버가 있습니다.
멤버 클래스 또는 기본 클래스에 전용 복사 생성자가 있습니다.
기본 클래스 또는 멤버 클래스에 복사 생성자가 없습니다.
주어진 클래스의 기본 대입 연산자 및 복사 생성자가 항상 선언되지만 다음 조건이 둘 다 충족되지 않으면 정의되지 않습니다.
클래스가 이 복사의 사용자 정의 함수를 제공하지 않습니다.
함수가 있어야 프로그램이 실행됩니다. 멤버 수준 복사를 필요로 하는 할당이나 초기화가 발생하거나 클래스의 operator= 함수에 대한 주소가 사용될 경우 이 요구 사항이 적용됩니다.
이 조건이 둘 다 충족되지 않으면 컴파일러가 기본 대입 연산자 및 복사 생성자 함수의 코드를 생성할 필요가 없습니다. Microsoft C++ 컴파일러가 최적화를 수행하면 이러한 코드가 제거됩니다. 특히 클래스가 "reference to class-name" 형식의 인수를 사용하는 사용자 정의 **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는 복사되지 않습니다.