/*
explicit的作用:
在C++中,explicit关键字是用来修饰类的构造函数的,被修饰的构造函数的类,不能发生相应的隐式类型的转换,
只能以显示的方式进行类型转换。
explicit使用的注意事项:
1.explicit关键字只能用于类内部的构造函数声明上。
2.explicit关键字作用于单个参数的构造函数,被修饰的构造函数的类,不能发生相应的隐式类型转换。
*/
#include<iostream>
using namespace std;
class Circle
{
public:
Circle(double r) : R(r) {}
Circle(int x, int y = 0) : X(x), Y(y) {}
Circle(const Circle& c) : R(c.R), X(c.X), Y(c.Y) {}
double R;
int X;
int Y;
};
class Circle_
{
public:
explicit Circle_(double r) : R(r) {}
explicit Circle_(int x, int y = 0) : X(x), Y(y) {}
explicit Circle_(const Circle_& c) : R(c.R), X(c.X), Y(c.Y) {}
double R;
int X;
int Y;
};
int main()
{
//发生隐式类型转换
Circle A = 1.23;
Circle B = 123;
Circle C = A;
cout << "A.R: " << A.R << endl;
cout << "B.X: " << B.X << "B.Y: " << B.Y << endl;
cout << "C.R: " << C.R << endl;
//以下六句都会报错,不存在隐式转换
//Circle_ A_ = 1.23;
//Circle_ B_ = 123;
//Circle_ C_ = A;
//Circle_ A_ = Circle_(1.23);
//Circle_ B_ = Circle_(123);
//Circle_ C_ = A;
Circle_ A_(1.23);
Circle_ B_(123);
Circle_ C_(A_);
cout << "A_.R: " << A_.R << endl;
cout << "B_.X: " << B_.X << "B_.Y: " << B_.Y << endl;
cout << "C_.R: " << C_.R << endl;
return 0;
}