C++ 抑制构造函数定义的隐式转换

来源:互联网 发布:spss如何分析数据 编辑:程序博客网 时间:2024/05/16 12:14

参考:《C++ Primer》 P256

构造函数添加explicit关键字修饰

例子

class StrBlob{public:    typedef std::vector<std::string>::size_type size_type;    StrBlob();    //StrBlob(std::initializer_list<std::string> il);    explicit StrBlob(std::initializer_list<std::string> il);    size_type size() const{ return data->size(); }    bool empty() const{ return data->empty(); }    void push_back(const std::string &str){ data->push_back(str); }    void pop_back();    std::string & front();    /*    如果定义const StrBlob 对象,则front函数应该对const进行重载,因为如果不重载,则const StrBlob 常量对象的this指针,    不能传给函数front的非常量的this指针,从而无法访问data数据成员,同时返回的元素类型也应该是const,因为const StrBlob 为常量对象    */    const std::string & front() const;     std::string & back();    const std::string &back() const;private:    std::shared_ptr<std::vector<std::string>> data;    void check(size_type i, const std::string &msg) const;};StrBlob b1;    for (size_t i = 0; i < 1; i++)    {        //StrBlob b2 = StrBlob({"a", "an", "the" });        StrBlob b2 = { "a", "an", "the" };        cout << b2.size()<<endl;        b1 = b2;        b2.push_back("about");    }    cout << b1.size() << endl;

当使用构造函数StrBlob(std::initializer_list il)时,初始化StrBlob的对象既可以执行直接初始化:StrBlob b2{ “a”, “an”, “the” };又可以执行拷贝形式的初始化:StrBlob b2 = { “a”, “an”, “the” };

当使用构造函数explicit StrBlob(std::initializer_list il)时,只能执行直接初始化:StrBlob b2{ “a”, “an”, “the” },因为explicit作用,初始化列表类型{ “a”, “an”, “the” }不能隐式转换为StrBlob类型; 但是可以StrBlob b2 = StrBlob({“a”, “an”, “the” })初始化;

0 0
原创粉丝点击