1.概念
1)只接受一个形参(但这个形参不是自身类型的引用)的构造函数,也可称为转换构造函数,它其实无形中为类定义了隐式转换规则
需要Sales_data对象的地方,我们可以用string或者istream替代:
2.阻止转换构造函数的隐式转换
2.1 使用explicit阻止
1)explicit 是阻止隐式转换的标识符
2)explicit只对一个形参的构造函数和类型转换运算符有效,多个形参的构造函数不会发生隐式转换,编译器允许对多个形参的构造函数指定explicit,但是这么做没有意义
3)所以被explicit了的构造函数只能用于直接初始化,不能用于拷贝初始化,因为拷贝初始化时等号右边可能会发生隐式转换
4)explicit只能出现在类内,不能出现在类外
2.4 实例:
1)接受一个容量大小的参数的vector的构造函数是explicit的
所以:
2)接受一个参数const *char(c字符串)的string构造函数不是explict的
class String{ public: String(const char *str = NULL); // 也是一个转换构造函数 String(const String &other); // 拷贝构造函数 ~String(void); // 析构函数 String & operate = (const String &other); // 赋值函数 private: char *m_data; // 用于保存字符串 };
所以string可以这样:
string null_book="9-999-99999-9"