티스토리 뷰

반응형
C++ 객체 초기화 방식 정리

✅ C++ 객체 초기화 방식

🔹 1. 기본 초기화 (Default Initialization)

📌 정의

객체를 생성할 때 생성자에 아무 값도 전달하지 않고 초기화하는 방식

✅ 문법


A a;     // 전통적 방식
A a{};   // C++11 이후 중괄호 기본 초기화

✅ 조건

  • 기본 생성자(매개변수 없음)이 반드시 존재해야 함

✅ 예제


class A {
public:
    A() {
        cout << "기본 생성자 호출됨" << endl;
    }
};

int main() {
    A a1;    // ✅ 기본 생성자 호출
    A a2{};  // ✅ 기본 생성자 호출 (C++11 방식)
}

⚠️ 주의


A a3();  // ⚠️ 함수 선언으로 간주됨 → 객체가 아님!



🔹 2. 복사 초기화 (Copy Initialization)

📌 정의

= 기호를 사용하여 객체를 생성하는 방식
복사처럼 보이지만 실제로는 생성자 호출이 일어남

✅ 문법


A a = A(값);      
A a = {값};       

✅ 조건

  • 해당 인자를 받을 수 있는 생성자가 존재해야 함

✅ 예제


class A {
public:
    A(int x) {
        cout << "생성자 호출: " << x << endl;
    }
};

int main() {
    A a1 = A(10);   
    A a2 = {20};    
}

⚠️ 주의


A a3 = {3.14};  // ❌ double → int narrowing 발생 시 에러



반응형

 


🔹 3. 소괄호 초기화 (Direct Initialization)

📌 정의

생성자에 괄호 ()를 사용하여 직접 인자를 전달하는 방식
전통적인 직접 생성자 호출 방식

✅ 문법


A a(값);

✅ 조건

  • 해당 인자에 맞는 생성자가 정의되어 있어야 함

✅ 예제


class A {
public:
    A(int x) {
        cout << "Direct: " << x << endl;
    }
};

int main() {
    A a1(10);     
    A a2(3.14);   // ✅ 자동 형변환 허용 → x = 3
}

⚠️ 특징

  • 암묵적 형변환 허용 → 축소(narrowing) 발생 가능
  • 실수로 데이터 손실 가능성 있음



🔹 4. 중괄호 초기화 (Brace Initialization, Uniform Initialization)

📌 정의

중괄호 {}를 사용하여 생성자를 호출하는 방식
C++11 이후 도입된 일관된(initializer list) 초기화 문법

✅ 문법


A a{값};

✅ 조건

  • 인자에 맞는 생성자가 정의되어 있어야 함

✅ 예제


class A {
public:
    A(int x) {
        cout << "Brace: " << x << endl;
    }
};

int main() {
    A a1{10};     
}

❌ 축소 초기화 금지 (narrowing error)


int x{3.14};   // ❌ 에러: double → int 허용 안 됨
A a2{3.14};    // ❌ 에러 발생



✅ 최종 요약 정리

초기화 방식 문법 예시 설명 축소 변환 허용 여부
기본 초기화 A a;, A a{} 인자 없는 생성자 호출 ⛔ 무관
복사 초기화 A a = A(10);, A a = {10}; 대입처럼 보이는 생성자 호출 ✅/❌ (중괄호 시 금지)
소괄호 초기화 A a(10); 직접 생성자 호출 ✅ 허용
중괄호 초기화 A a{10}; C++11 이후 방식, 더 안전 ❌ 금지됨




반응형

 


✅ 결론

  • 🔹 초기화 방식은 문법이 다를 뿐 전부 생성자를 호출합니다.
  • 🔹 중괄호 {}는 안전하지만, 축소 변환은 금지되므로 타입 주의가 필요합니다.
  • 🔹 정확한 의도를 반영하기 위해 초기화 방식을 구분해서 사용하는 습관이 중요합니다.

반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
글 보관함
반응형