✅ 생성자의 parameter
x를 받아서,
✅ 멤버 변수x에 초기화하고 싶지만,
❌default parameter는 원하지 않는다
class Base {
int x;
public:
Base() : x(x) {}; // ❌ 문제: x(x)에서 오른쪽 x는 정의되지 않음
};
생성자 B()는 parameter가 없음 → 그런데 x(x)에서 오른쪽 x는 지역 변수인데 그런 게 없음 → 컴파일 에러
즉, x = x;에서 두 개의 x 모두 같은 멤버 변수인데, 오른쪽 x는 아직 초기화되지 않았으므로 이건 초기화가 아닌 자기 자신에게 초기화를 시도하는 꼴 → 컴파일 에러!
class Base {
int x;
public:
Base(int x) : x(x) {}
};
여기서 x(x)의 의미는:
x: 멤버 변수 Base::xx: 생성자 파라미터 int x💡 멤버와 파라미터 이름이 같을 경우엔 이니셜라이저 리스트가 우선 멤버를 초기화하므로, 이름이 같아도 헷갈리지 않아.
(혹은 this->x = x;처럼 써도 되지만 이니셜라이저 리스트가 더 효율적이야)
| 코드 | 의미 |
|---|---|
C(); | 클래스 안에서 → 기본 생성자 "선언" |
C() {} | 클래스 안에서 → 기본 생성자 "정의" |
C c1(); | ⚠️ 함수 선언 (객체 아님) |
C c1; | 객체 생성 (기본 생성자 호출) |
class Base {
int x;
public:
Base(int x) : x(x) {}
};
이게 너가 원하는 정확한 코드야.
❌ default parameter 없이,
✅ 생성자 인자로 받은 x를 멤버 변수에 대입하는 가장 깔끔한 방법이야.
class Base {
int x;
public:
Base() : x(x) {} // ❌ 에러
};
이 생성자는 파라미터가 없음
그런데 x(x)는 오른쪽 x가 undefined 식별자
즉, x = x;에서 두 개의 x 모두 같은 멤버 변수인데, 오른쪽 x는 아직 초기화되지 않았음
이건 초기화가 아닌 자기 자신에게 초기화를 시도하는 꼴 → 컴파일 에러!
template <typename T, int N>
class Data {
std::vector<T> v;
public:
Data() : v(N) {} // ✅ 정상
};
Data<int, 3> d1; // 괄호 없이 객체 생성 → 이때 Data()가 호출됨
Data<int, 3> d;
이 자체는 생성자 호출이 아닙니다. “객체를 선언”하는 문장입니다.
하지만 👉 이때 생성자가 자동으로 호출됩니다.
| 코드 | 의미 |
|---|---|
Data<int, 3> d; | d라는 이름의 Data<int, 3> 객체 생성 |
Data<int, 3> | 템플릿 클래스 Data를 타입 int, 크기 3으로 특수화 |
d | 객체 이름 |
; | 기본 생성자를 자동으로 호출 |
즉, 이 코드는:
“
Data<int, 3>타입의d라는 객체를 만들며,
기본 생성자Data()를 자동 호출한다”는 뜻입니다.
class A {
public:
A() { std::cout << "기본 생성자 호출됨\n"; }
};
int main() {
A a; // 생성자 직접 안 썼지만, A()가 자동으로 호출됨
}
a;는 그냥 선언처럼 보이지만,A() 생성자가 자동으로 호출됨Data<int, 3> d(0, 5);
🔹 Data<int, 3>
🔹 d(0, 5)
Data<int, 3> 라고 N = 3으로 고정했는데, (0, 5)에서 크기를 5로 주는 건 앞뒤가 안 맞는 거예요
| 의미 | 값 |
|---|---|
| 템플릿에서 지정한 크기 | 3 |
| 생성자에서 요청한 크기 | 5 |
| 실제 생성되는 vector 크기 | 5 |
이러면 Data<int, 3>는 “크기 3”으로 보이지만, 실제로는 5개의 데이터를 가짐 → 논리 오류
Data<int, 3> d; → 객체 정의/선언