第42课 类型转换函数
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第42课 类型转换函数相关的知识,希望对你有一定的参考价值。
1. 类型转换函数
(1)C++类中可以定义类型转换函数
(2)类型转换函数用于将类对象转换为其它类型
(3)语法规则:
operator Type() //重载类型运算符 { Type ret; //…… return ret; }
【编程实验】类型转换函数初探
#include <iostream> using namespace std; class Test { int mValue; public: Test(){mValue = 0;} //转换构造函数 Test(int i = 0) { mValue = i; } //类型转换函数 operator int() { return mValue; } int value() { return mValue; } }; int main() { Test t(100); int i = t; //t对象是Test类型,会调用转为int的类型转换函数 //即隐式调用类型转换函数,等价于int i = t.operator int(); cout << "t.value() = " << t.value() << endl; //100; cout << "i = " << i << endl; //100 return 0; }
2. 类型转换函数的意义
(1)类型转换函数与转换构造函数具有同等的地位
(2)使用编译器有能力将对象转化为其它类型
(3)编译器会尽力尝试让源码通过编译
Test t(1); int i = t; //t对象为Test类型,怎么可能用于初始化int类型的变量呢?现在就报 //错吗?不急,编译器会看看有没有类型转换函数!Ok,发现Test类中定 //义了opreator int(),可以进行转换。
(4)编译器能够隐式的使用类型转换函数
【编程实验】类类型之间的转换
#include <iostream> using namespace std; //前置声明 class Test; class Value { public: Value(){} //转换构造函数 explicit Value(Test& t) { } }; class Test { int mValue; public: Test(){mValue = 0;} //转换构造函数 Test(int i = 0) { mValue = i; } //类型转换函数 operator Value() { Value ret; cout << "operator Value()" << endl; return ret; } int value() { return mValue; } }; int main() { Test t(100); Value v = t; //如果Value类中的转换构造函数不加explicit,这会造成Test类的类型 //转换函数与Value类的转换构造函数的冲突。因为编译器看到这行时 //会出现两种理解:1、Value v(t),调用的是Value类的转换构造函数 //也可以理解成Value v = t.operator Value();调用的是Test类的类 //型转换函数,出现了二义性。因此加上explicit后会阻止第1种可能 //最后,等价于第2种,所以结果会输出:"operator Value()" //Value v = static_cast<Value>(t);//相当于value v(t); return 0; }
3. 注意事项
(1)无法抑制隐式的类型转换函数调用
(2)类型转换函数可能与转换构造函数冲突
(3)工程中以Type toType()的公有成员代替类型转换函数,如toInt()、toString()等。
4. 小结
(1)C++类中可以定义类型转换函数
(2)类型转换函数用于将类对象转换为其它类型
(3)类型转换函数与转换构造函数具有同等的地位
(4)工程中以Type toType()的公有成员代替类型转换函数
以上是关于第42课 类型转换函数的主要内容,如果未能解决你的问题,请参考以下文章