본문 바로가기
언어/C, CPP

[c++] 생성자 선언

by minhyeok.lee 2025. 6. 14.
반응형

임베디드 시스템에서 생성자 선언

1. PanelController()라는 예를 들어 아래 3가지 선언방식이 존재

2. PanelController();, explicit PanelController();, 아예 생성자를 선언하지 않을 때

3. 이 세 가지 케이스는 C++에서 기본 생성자의 자동 생성 여부와 객체 초기화의 유연성에 큰 영향을 줌


✅ 1. 선언 방식별 정리

선언 방식 설명 암시적 생성 가능 여부 생성자 자동 생성 여부 의미
없음 생성자를 아예 선언 안 함 가능 (단, 조건 있음) 클래스에 조건 충족 시 자동 생성 가장 일반적인 방식. 단, 다른 생성자나 멤버가 있으면 안 생길 수도 있음
PanelController(); 명시적 기본 생성자 선언 가능 ❌ 직접 선언했으므로 자동 생성 안 됨 명확하게 기본 생성자를 제공할 때 사용
explicit PanelController(); 암시적 변환 금지 ❌ 암시적 사용 불가 ❌ 직접 선언 기본 생성도 꼭 명시적이어야 할 때 사용 (거의 드물게 사용됨)

✅ 2. 클래스 예시별 케이스 분석

🟢 [Case A] 생성자 아예 없음

class PanelController {
  int value;
};
  • 기본 생성자 자동 생성됨
  • PanelController pc; 또는 PanelController(); OK
  • 단, 멤버 중 기본 생성 안 되는 타입이 있다면 컴파일 에러 발생

🟡 [Case B] 사용자 정의 생성자만 있는 경우

class PanelController {
public:
  PanelController(int value);
};
  • 컴파일러가 기본 생성자 자동 생성 안 함
  • PanelController(); → ❌ 컴파일 에러
  • 본 생성자를 명시적으로 추가해야 함

🔵 [Case C] 기본 생성자 직접 선언

class PanelController {
public:
  PanelController();  // <- 명시적으로 선언
};
  • 무조건 기본 생성 가능
  • PanelController pc;, PanelController(); OK
  • 가장 명확하고 직관적인 방식

🔴 [Case D] explicit이 붙은 기본 생성자

class PanelController {
public:
  explicit PanelController();
};
  • PanelController pc; OK
  • PanelController() OK
  • auto pc = PanelController{} OK
  • someFunc({}) 같은 암시적 생성 불가

이건 보통 explicit PanelController(int) 같은 인자 있는 생성자에 더 의미가 있음
인자 없는 기본 생성자에 explicit 붙이는 건 거의 안 씀


🎯 결론: 어떤 게 정석인가?

상황 추천 방식 이유
단순 POD-style 클래스 생성자 생략 (자동 생성) 불필요한 선언 생략 가능
멤버 초기화 필요하거나 명확성 중시 PanelController(); 명시 코드 명확성과 유지 보수에 도움
생성자에 인자가 있을 때 explicit PanelController(int) 암시적 변환 방지 필요
인자 없는 생성자에 explicit ❌ 지양 의미 없음. 실수 방지 외에는 무의미

💡 실전 팁

  • STM32 같은 임베디드 시스템에서는 명시적 기본 생성자 선언을 추천
    → 구조체 멤버 초기화, 제어 흐름, 필터 객체 관리 등에서 명확성이 중요
class PanelController {
public:
  PanelController(); // ✅ 정석
};
반응형

'언어 > C, CPP' 카테고리의 다른 글

메모리 영역 정리  (0) 2025.06.19
RAII(Resource Acquisition Is Initialization)  (0) 2025.06.16
[c++] explicit 키워드  (0) 2025.06.13
Interface vs concept  (1) 2025.06.04
[c++] concept  (0) 2025.06.03

댓글