C++ - 隐式类类型转换
2015-11-24 14:59
826 查看
1. C++语言定义了内置类型之间的几个自动转换。也可以定义如何将其他类型的对象隐式转换为我们的类类型,或将我们的类类型的对象隐式转换为其他类型。
2. 为了定义到类类型的隐式转换,需要定义合适的构造函数。
3. 可以用单个实参来调用的构造函数定义了从形参类型到该类类型的一个隐式转换。
4. 举例:
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,来防止在需要隐式转换的上下文中使用构造函数:
explicit关键字只能用于类内部的构造函数声明上。在类的定义体外部所做的定义上不再重复它。
8. explicit抑制隐式转换举例:
9. 为转换而显式使用构造函数:
10. 通常,除非有明显的理由想要定义隐式转换,否则,但形参构造函数应该为explicit。将构造函数设置为explicit可以避免错误,而且当转换有用时,用户可以显式地构造对象。
注:转载出自:http://www.cnblogs.com/xushjie/archive/2012/09/23/2698590.html
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
相关文章推荐
- C++primer plus第六版课后编程练习答案2.3
- qt下bezier曲线的绘制(C++)
- C++primer plus第六版课后编程练习答案2.2
- C++primer plus第六版课后编程题练习答案2.1
- C/C++——友元函数
- C++先,中,后顺序遍历的非递归实现
- C++之日志打印
- 第一章:C语言数据类型
- C语言-----循环单链表
- PVS-Studio C/C++/C++11 静态代码分析工具
- 线程安全的的map-CSuperMap
- 《C++编程规范:101条规则、准则与最佳实践》学习笔记
- vs2012编译c语言-指针不能判NULL
- 迷宫最少步数的求解(利用队列)
- 《C++必知必会》学习笔记
- C++笔记(8) template partitial specialization模板偏特化
- c++实现封装socket2
- 顺序队的基本操作(C++完整代码)
- C语言常见命名规范
- C++学习中关于cout遇到的一个小问题