다음을 통해 공유


멤버 수준 할당 및 초기화

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

참고 항목

참조

클래스 개체를 복사합니다.