#include <iostream>
#include <string>
class Entity
{
private:
std::string m_Name;
int m_Age;
public:
Entity(const std::string& name)
: m_Name(name),m_Age(-1){}
Entity(int age)
: m_Name("Unknown"), m_Age(age) { }
};
int main()
{
Entity a = "dajain";
Entity b = 22;
std::cin.get();
}
为什么这里的b不报错,我们让Entity等于一个22 的常数这应该报错啊(实体类里有一个string
),但是他没有,这里就是我们要说的隐式转换,也叫隐式构造,可以隐式的将22转换成一个Entitiy,构造出一个Entity,因为我们的实体类中有构造函数一个接受整数参数,另外一个接受字符串作为参数。我们再看另外一个例子
#include <iostream>
#include <string>
class Entity
{
private:
std::string m_Name;
int m_Age;
public:
Entity(const std::string& name)
: m_Name(name),m_Age(-1){}
Entity(int age)
: m_Name("Unknown"), m_Age(age) { }
};
void PrintEntity(const Entity& enttity)
{
//prnting
}
int main()
{
PrintEntity(22);
PrintEntity(“dajian”); //报错
PrintEntity(std::string("dajain"));
PrintEntity(Entity("dajan "));
std::cin.get();
}
在上面这例子中,22可以转换成一个Entity,因为你可以调用这个构造函数,22是你创建Entity的唯一参数,那我调用“dajian” 为什么报错呢?,因为他是const char数组 dajian6个字符加一个空的终止字符,如果要让他正常实现打印,我们需要两次转换,一次const char 到string 一个是string到Entity,但是它只允许一次隐式转换,所以我们有两种方法,一种是包装在一个构造函数中,还有一种则是包装在Entity对象中。
那什么是explicit呢?就是不允许隐式转换。必须要显示调用,就和下面这代码一样。
#include <iostream>
#include <string>
class Entity
{
private:
std::string m_Name;
int m_Age;
public:
Entity(const std::string& name)
: m_Name(name),m_Age(-1){}
explicit Entity(int age)
: m_Name("Unknown"), m_Age(age) { }
};
void PrintEntity(const Entity& enttity)
{
//prnting
}
int main()
{
PrintEntity(22);//前面加了explicit后这了就会报错了
PrintEntity(std::string("dajain"));
PrintEntity(Entity("dajan "));
Entity b = 22;//前面加了explicit后这了就会报错了
std::cin.get();
}
那么如果我们就是想让这个b不报错,那就只能强制转换了Entity b = Entity(22);