class things
{
public:
things(const std::string&name =""):
m_name(name),height(0),weight(10){}
int CompareTo(const things & other);
std::string m_name;
int height;
int weight;
};
在使用该类时,这里things的构造函数可以只用一个实参完成初始化。所以可以进行一个隐式转换,像下面这样:
things a;
................//在这里被初始化并使用。
std::string nm ="book_1";
//由于可以隐式转换,所以可以下面这样使用
int result = a.CompareTo(nm);
#注意#
这段程序使用一个string类型对象作为实参传给things的CompareTo函数。
这个函数本来是需要一个tings对象作为实参。现在编译器使用string nm来构造并初始化一个things对象,
新生成的临时的things对象被传递给CompareTo函数,并在离开这段函数后被析构。
对于声明为explicit的构造函数
class things
{
public:
explicit things(const std::string&name =""):
m_name(name),height(0),weight(0){}
int CompareTo(const things & other);
std::string m_name;
int height;
int weight;
};
在使用时不能再传入string来隐式构造,必须显示构造
std::string nm = "book_2";
int result = a.CompareTo(things(nm)); //必须显示构造
这种行为的正确与否取决于业务需要。假如你只是想测试一下a的重量与10的大小之比,这么做也许是方便的。但是假如在CompareTo函数中还涉及到了要除以初始化为0的height属性,那么这么做可能就是错误的。需要在构造tings之后更改height属性不为0。
google的c++规范中提到explicit的优点是可以避免不合时宜的类型变换,缺点无。所以google约定所有单参数的构造函数都必须是显示的,只有极少数情况下拷贝构造函数可以不声明称explicit。