在这里,我们将看到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) { //构造函数 } 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) { //构造函数 } 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) { //构造函数 } 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