参考:《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” })初始化;