다음을 통해 공유


명시적 초기화

C++에서는 두 가지 형태의 명시적 초기화를 지원합니다.

  • 이니셜라이저 목록을 괄호 안에 제공:

    String sFileName( "FILE.DAT" );
    

    괄호로 묶은 목록의 항목은 클래스 생성자에 대한 인수로 간주됩니다. 이 형태의 초기화는 값이 두 개 이상인 개체를 초기화할 수 있도록 하며 new 연산자와 함께 사용할 수도 있습니다. 예를 들면 다음과 같습니다.

    Rect *pRect = new Rect( 10, 15, 24, 97 );
    
  • 등호 초기화 구문을 사용하여 단일 이니셜라이저 제공. 예를 들면 다음과 같습니다.

    String sFileName = "FILE.DAT";
    

    앞의 예제는 첫 번째 목록 항목에 있는 String에 대해 표시된 예제와 같은 방식으로 작동하지만, 이 구문은 사용 가능한 저장소에 할당된 개체와 함께 사용하는 데는 적용할 수 없습니다.

    등호 오른쪽의 단일 식은 클래스의 복사 생성자에 대한 인수로 사용됩니다. 따라서 이 식은 클래스 형식으로 변환될 수 있는 형식이어야 합니다.

    초기화 컨텍스트에서 등호(=)가 할당 연산자와 다르기 때문에 **operator=**를 오버로드하는 경우 초기화에 영향을 주지 않습니다.

대부분의 경우 생성된 코드가 동일하더라도 등호 초기화 구문은 함수 스타일 구문과 다릅니다. 차이점은 등호 구문이 사용될 때 컴파일러가 다음 이벤트 시퀀스가 발생하는 것처럼 동작해야 한다는 점입니다.

  • 초기화되는 개체와 같은 형식의 임시 개체 만들기

  • 개체에 임시 개체 복사

생성자에 액세스할 수 있어야 컴파일러에서 이러한 단계를 수행할 수 있습니다. 컴파일러에서 대부분의 경우 임시 생성 및 복사 단계를 제거할 수 있더라도 액세스할 수 없는 복사 생성자로 인해 등호가 초기화되지 않습니다(/Za, /Ze(언어 확장 사용 안 함)에서). 다음 예제를 참조하십시오.

// spec1_explicit_initialization.cpp
// compile with: /Za
class anInt {
   anInt( const anInt &copy ) {}   // private copy constructor

public:
   anInt( int ) {}   // public constructor
};

int main() {
   // Access-control violation. 
   // Attempt to reference private copy constructor.
   anInt myInt = 7;   // C2248

   anInt myInt2(7);   // Correct; no copy constructor called.
}

함수가 호출될 때 값으로 전달되는 클래스 형식 인수와 값에 의해 반환되는 개체는 다음 형태를 사용하여 개념적으로 초기화됩니다.

type-name name = value

예를 들면 다음과 같습니다.

String s = "C++";

따라서 이는 인수 형식이 인수로 전달될 클래스 형식으로 변환될 수 있는 형식이어야 한다는 규칙을 따르고 있습니다. 클래스의 복사 생성자와 실제 인수의 형식을 받아들이는 사용자 정의 변환 연산자 또는 생성자는 public이어야 합니다.

new 연산자를 사용하는 식에서 사용 가능한 저장소에 할당되는 개체는 다음 형태를 사용하여 개념적으로 초기화됩니다.

type-name name**(** initializer1, initializer2, ... initializer)

예를 들면 다음과 같습니다.

String *ps = new String( "C++" );

기본 클래스의 구성 요소 및 클래스의 멤버 개체에 대한 이니셜라이저도 이 방식으로 개념적으로 초기화됩니다. 자세한 내용은 기본 항목 및 멤버 초기화를 참조하십시오.

참고 항목

참조

특수 멤버 함수를 사용한 초기화