在C++类的实例化过程中,存在一种隐式转换,即可以用单个实参来调用的构造函数定义了从形参类型到该类类型的一个隐式转换。
一个简单的例子:
#include <iostream>
#include <string>
using namespace std;
class Book
{
public:
Book(){}
Book(const string name, const int price = 100) : _name(name), _price(price){
cout << "构造函数调用!" << endl;;
};
void IsSameBook(const Book & book)
{
if (_name == book._name)
cout << "两本书重名!" << endl;
else
cout << "两本书不重名!" << endl;
}
private:
string _name;
int _price;
};
void main()
{
Book A("AA");
A.IsSameBook(string("AA"));
system("Pause");
}
构造函数调用!
构造函数调用!
两本书重名!
为了防止这种意料之外的隐式转换,在类的构造函数前加上explicit关键字,可以防止形参隐式转换为该类类型的转换:
#include <iostream>
#include <string>
using namespace std;
class Book
{
public:
Book(){}
explicit Book(const string name, const int price = 100) : _name(name), _price(price){
cout << "构造函数调用!" << endl;;
};
void IsSameBook(const Book & book)
{
if (_name == book._name)
cout << "两本书重名!" << endl;
else
cout << "两本书不重名!" << endl;
}
private:
string _name;
int _price;
};
void main()
{
Book A("AA");
Book B = Book("AA");
A.IsSameBook(B);
system("Pause");
}
构造函数加上explicit关键字之后,使用A.IsSameBook(string("AA"))的写法,编译器会报错。explicit的作用就是防止其他类型对该类类型的隐式转换,但仍可以以显示转换的方式调用, 如 Book B=Book("AA")的写法。