반응형
임베디드 시스템에서 생성자 선언
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;
OKPanelController()
OKauto 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 |
댓글