转载博客:函数
http://blog.csdn.net/thefutureisour/article/details/7705771spa
构造函数会引发一个不引人注意的问题:
用单个实参来调用的构造函数定义了从从形参类型到类类型的一个隐式转换。
举个例子说:.net
- class Sales_item
- {
- public:
- std::istream& input(std::istream& in);
- std::ostream& output(std::ostream& out);
- inline double avg_price() const;
- bool same_isbn(const Sales_item &rbs) const
- {
- return isbn == rbs.isbn;
- }
- Sales_item add(Sales_item& other);
- Sales_item(const std::string &book = "7115145547"):isbn(book),units_sold(0),revenue(0.0){}
- private:
- std::string isbn;
- unsigned units_sold;
- double revenue;
- };
这个类的same_isbn函数的输入参数是这个类的类型,可是咱们却能够这样调用这个函数:设计
- Sales_item trans1;
- string null_book = "9-999-99999-9";
- trans1.same_isbn(null_book);
这是由于Sales_item的构造函数能够是带单个实参的(也能够不带实参,由于我定义了默认实参7115145547),这时在调用trans1.same_isbn(null_book);时,就会发生类型转化:从string转换为Sales_item。创建一个临时的类的对象(一旦函数调用结束,就不能再放这个对象了)。code
为了不这个状况的发生,能够将类的构造函数声明为explicit:对象
- explicit Sales_item(const std::string &book = "7115145547"):isbn(book),units_sold(0),revenue(0.0){}
这样,前面的默认类型转化就不起做用了。因此对于单形参构造函数,除非有很是明显的理由让他发生隐式类型转换,否者咱们应该把它设计为explicit,防止隐式转化的发生。blog
固然咱们总能够为转化而显示的使用构造函数:ip
- trans1.same_isbn(Sales_item(null_book));