您的位置:首页 > 编程语言 > C语言/C++

C++ - 隐式类类型转换

2015-11-24 14:59 696 查看
1. C++语言定义了内置类型之间的几个自动转换。也可以定义如何将其他类型的对象隐式转换为我们的类类型,或将我们的类类型的对象隐式转换为其他类型。

2. 为了定义到类类型的隐式转换,需要定义合适的构造函数。

3. 可以用单个实参来调用的构造函数定义了从形参类型到该类类型的一个隐式转换。

4. 举例:

1 class Sales_item
2 {
3 public:
4     Sales_item(const std::string & book);
5     Sales_item(std::istream & is);
6 };
7
8 bool same_isbn(Sales_item book)
9 {
10 }
11
12 std::string null_book = "9-999-99999-9";
13 same_isbn(null_book);
14 same_isbn(cin);


5. 使用一个string类型对象作为实参传给same_isbn函数,编译器使用接收一个string的Sales_item构造函数从null_book生成一个新的Sales_item对象,新生成的(临时的)Sales_item被传递给same_isbn函数。

6. 将cin隐式转换为Sales_item。这个转换执行接收一个istream的Sales_item构造函数。该构造函数通过读标准输入来创建一个(临时的)Sales_item对象。然后该对象被传递给same_isbn函数。

7. 抑制由构造函数定义的隐式转换:

可以通过将构造函数声明为explicit,来防止在需要隐式转换的上下文中使用构造函数:

1 class Sales_item
2 {
3 public:
4     explicit Sales_item(const std::string & book);
5     explicit Sales_item(std::istream & is);
6 };
7
8 // error: explicit只能用于类内部声明上
9 explicit Sales_item::Sales_item(std::istream & is)
10 {
11     is >> *this;
12 }


explicit关键字只能用于类内部的构造函数声明上。在类的定义体外部所做的定义上不再重复它。

8. explicit抑制隐式转换举例:

1 same_isbn(null_book); // error
2 same_isbn(cin); // error


9. 为转换而显式使用构造函数:

1 same_isbn(Sales_item(null_book)); // ok


10. 通常,除非有明显的理由想要定义隐式转换,否则,但形参构造函数应该为explicit。将构造函数设置为explicit可以避免错误,而且当转换有用时,用户可以显式地构造对象。



注:转载出自:http://www.cnblogs.com/xushjie/archive/2012/09/23/2698590.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: