c++中的隐式对话和隐式关键词

这是一个简单的类的声明和调用

#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("Unknow"),m_Age(age){}
};

int main()
{
    Entity a("Wangtn");//Entity a=Entity("Wangtn");
    Entity b(26);//Entity b=Entity(26);
    std::cin.get();
}

如果我们使用隐式方式的话,也可以这样来初始化它

int main()
{
    Entity c = (const std::string&)"Wangtn";
    Entity d = 26;
    std::cin.get();
}

如果有这样一个函数,你可以在主函数中如下调用它

void Print(const Entity& entity)
{
    //print something
}
int main()
{
    Print(22);
    Print((const std::string&)"Wangtn");

    std::cin.get();
}

直接写Print("Wangtn");的话会报错,因为string要在命名空间中使用,编译器会默认wangtn是char字符串,所以要进行强制类型转化,强制类型转化可以有两种转法

Print(std::string("Wangtn"));
Print(Entity("Wangtn"));

通常情况下(更简洁的写法)

Entity a("Wangtn");
Entity b(22);

如果我们在类中使用隐式关键词

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("Unknow"),m_Age(age){}
};

那么可以看到在主函数的调用中,直接填入数字的隐式方式将会失效

 如果我想要不报错,那么必须要这么写

Entity b(26);
Entity b=Entity(26);

猜你喜欢

转载自www.cnblogs.com/wangtianning1223/p/12811652.html