다음을 통해 공유


멤버 수준 할당 및 초기화

기본 할당 및 초기화 방법은 "멤버 수준 할당"과 "멤버 수준 초기화"입니다. 멤버 수준 할당은 각 멤버를 개별적으로 할당하는 것처럼 한 번에 멤버 하나씩 한 개체를 다른 개체로 복사하는 방식입니다. 멤버 수준 초기화는 각 멤버를 개별적으로 초기화하는 것처럼 한 번에 멤버 하나씩 한 개체를 다른 개체로 복사하는 방식입니다. 두 할당의 주된 차이는 멤버 수준 할당이 각 멤버의 대입 연산자(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는 복사되지 않습니다.

참고 항목

참조

클래스 개체 복사