-
[C++] Explicit프로그래밍/C & C++ 2024. 7. 8. 20:10728x90반응형
explicit
키워드는 C++에서 생성자 앞에 사용되어 암시적(implicit) 형 변환과 단일 인수를 가지는 생성자의 암시적 호출을 방지하는 역할을 합니다. 이는 코드의 명확성을 높이고, 의도하지 않은 형 변환으로 인한 오류를 방지하는 데 도움을 줍니다.암시적 형 변환과 단일 인수 생성자
기본적으로, 단일 인수를 가지는 생성자는 암시적 형 변환을 허용합니다. 이는 생성자가 단일 인수를 받을 때, 그 인수를 통해 객체를 자동으로 생성할 수 있게 합니다. 예를 들어:
#include <iostream> class MyClass { public: MyClass(int x) { std::cout << "Constructor called with value: " << x << std::endl; } }; void func(MyClass obj) { // ... } int main() { func(42); // 암시적으로 MyClass(42) 생성자가 호출됨 return 0; }
위 코드에서
func(42);
는int
타입의 42를MyClass
타입으로 암시적으로 변환하여 생성자를 호출합니다. 이는 유연성을 제공하지만, 원치 않는 형 변환이 발생할 수 있는 위험이 있습니다.explicit
키워드 사용explicit
키워드를 사용하면 이러한 암시적 형 변환을 방지할 수 있습니다.explicit
키워드는 단일 인수를 가지는 생성자 앞에 위치하며, 이 생성자가 암시적으로 호출되지 않도록 합니다.explicit
키워드 사용 예제#include <iostream> class MyClass { public: explicit MyClass(int x) { std::cout << "Constructor called with value: " << x << std::endl; } }; void func(MyClass obj) { // ... } int main() { // func(42); // 이 줄은 컴파일 오류를 발생시킵니다. func(MyClass(42)); // 명시적으로 MyClass 객체를 생성 return 0; }
위 코드에서
explicit
키워드가MyClass
생성자 앞에 사용되었습니다. 이로 인해func(42);
는 더 이상 유효하지 않으며,MyClass
객체를 명시적으로 생성해야 합니다.왜
explicit
을 사용하는가?- 명확성:
explicit
키워드를 사용하면 생성자가 명시적으로 호출되어야 하므로 코드가 더 명확해집니다. - 안전성: 암시적 형 변환을 방지하여 의도하지 않은 변환으로 인한 버그를 줄일 수 있습니다.
- 유지 보수성: 명시적인 호출은 코드의 의도를 분명히 하여, 코드 유지 보수를 쉽게 만듭니다.
주의 사항
explicit
키워드는 단일 인수를 가지는 생성자에만 적용됩니다. 여러 인수를 가지는 생성자는 암시적 형 변환에 대해 덜 민감하기 때문입니다.explicit
키워드는 변환 생성자(conversion constructor)에도 적용될 수 있습니다.
예제: 변환 생성자에
explicit
적용#include <iostream> class MyClass { public: explicit MyClass(int x) { std::cout << "Constructor called with value: " << x << std::endl; } explicit operator int() const { return 42; // 예시로 반환하는 값 } }; int main() { MyClass obj(10); // int value = obj; // 컴파일 오류: 명시적 변환 필요 int value = static_cast<int>(obj); // 명시적 변환 std::cout << "Value: " << value << std::endl; return 0; }
위 코드에서
explicit
키워드는 변환 생성자에도 적용되어,obj
를int
로 암시적으로 변환할 수 없게 합니다. 대신 명시적 변환인static_cast<int>(obj)
가 필요합니다.결론
explicit
키워드는 C++에서 암시적 형 변환을 방지하여 코드의 명확성과 안전성을 높이는 데 유용합니다. 이를 통해 코드의 의도를 명확히 하고, 의도하지 않은 변환으로 인한 오류를 줄일 수 있습니다.728x90반응형'프로그래밍 > C & C++' 카테고리의 다른 글
[C++] L-Value & R-Value (0) 2024.07.15 [C++] 연산자 다중 정의 (Operator Overloading) (0) 2024.07.08 [C++] 대입연산자 (0) 2024.07.08 [C++] 댕글링 포인터 (Dangling Pointer) (0) 2024.07.07 [C++] 클래스 생성자 맴버 초기화 (0) 2024.07.07 - 명확성: