여기서 우리는 C++에서 명시적 키워드의 효과가 무엇인지 볼 것입니다. 이에 대해 논의하기 전에 하나의 예제 코드를 보고 그 출력을 알아보겠습니다.
예
#include <iostream> using namespace std; class Point { private: double x, y; public: Point(double a = 0.0, double b = 0.0) : x(a), y(b) { //constructor } bool operator==(Point p2) { if(p2.x == this->x && p2.y == this->y) return true; return false; } }; int main() { Point p(5, 0); if(p == 5) cout << "They are same"; else cout << "They are not same"; }
출력
They are same
이것은 하나의 생성자를 하나의 인수만 사용하여 호출할 수 있는 경우 변환 생성자로 변환된다는 것을 알고 있기 때문에 잘 작동합니다. 그러나 이러한 종류의 변환은 신뢰할 수 없는 결과를 생성할 수 있으므로 피할 수 있습니다.
이 변환을 제한하기 위해 생성자와 함께 명시적 수정자를 사용할 수 있습니다. 이 경우 변환되지 않습니다. 명시적 키워드를 사용하여 위 프로그램을 사용하면 컴파일 오류가 발생합니다.
예
#include <iostream> using namespace std; class Point { private: double x, y; public: explicit Point(double a = 0.0, double b = 0.0) : x(a), y(b) { //constructor } bool operator==(Point p2) { if(p2.x == this->x && p2.y == this->y) return true; return false; } }; int main() { Point p(5, 0); if(p == 5) cout << "They are same"; else cout << "They are not same"; }
출력
[Error] no match for 'operator==' (operand types are 'Point' and 'int') [Note] candidates are: [Note] bool Point::operator==(Point)
명시적 캐스팅을 사용하여 여전히 값을 Point 유형으로 유형 변환할 수 있습니다.
예
#include <iostream> using namespace std; class Point { private: double x, y; public: explicit Point(double a = 0.0, double b = 0.0) : x(a), y(b) { //constructor } bool operator==(Point p2) { if(p2.x == this->x && p2.y == this->y) return true; return false; } }; int main() { Point p(5, 0); if(p == (Point)5) cout << "They are same"; else cout << "They are not same"; }
출력
They are same