转换构造函数

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"
原文地址:https://www.cnblogs.com/Joezzz/p/9683690.html