C++之类类型转换
2016-06-05 07:59
295 查看
C++存在类类型,必然也存在类的类型转换,个标准类型一样,两个类型必须有相似性,才可以相互转换。比如不能把一个string类型转换成double类型,就算强制转换也是不可以滴,类的转换方式有两种:类型转换的构造器和类型转换操作符函数。
一、类型转换构造器
还是先给个例子:
结果为:
显然从Point2D类型成功转换到了Point3D类型。
从例子可以看出,这个类型转换函数其实就是个构造器,并且只有一个参数,这有这样的才称为类型转换构造器,多个参数或没有参数的都只是构造器而已。这里给出类型转换构造器的格式:
可以看出来,这个类型转换构造器是放在目标类里面的,同时不要忘了因为目标类可能要访问源类的私有成员,那就得把目标类声明为源类的友元类,当然也可以只把类型转换构造器声明为源类的友元函数,就是格式比较麻烦,说友元时(C++之友元)已经详细说明了,这里就不重复解释了。
二、类型转换操作符函数
还是先举个例子,上面是把Point2D转换成Point3D,这次把Point3D转换成Point2D:
执行结果:
从例子可以看出源类转换到目标类,是在源类中声明类型转换操作符函数,并且,无参无返回,却有return(不要问为什么,甲鱼臀部的规定,你懂得),下面给出类型转换操作符函数的格式:
三、explicit
explicit 是个仅用于声明的关键字,表示必须使用显示方式进行类型转换,否则就报错:
现在把类型转换构造器和类型转换操作符函数前面都加了一个explicit的关键字,那么在做类型转换时:
现在就不可以使用隐式转换,就需要改成:
这两种格式都可以,关键就要做出显示类型转换,当然如果不声明explicit,类型转换默认都是可以进行隐式类型转换的。
一、类型转换构造器
还是先给个例子:
class Point2D{ private: int _x; int _y; public: Point2D(int x = 0, int y = 0):_x(x), _y(y){} friend class Point3D; friend ostream& operator<<(ostream& os, Point2D &p2){ os << "( " << p2._x << "," << p2._y << " )"; return os; } }; class Point3D{ private: int _x; int _y; int _z; public: Point3D(int x = 0, int y = 0, int z = 0):_x(x), _y(y), _z(z){} Point3D(const Point2D &p2){ //类型转换构造器 this->_x = p2._x; this->_y = p2._y; this->_z = 0; } friend ostream& operator<<(ostream& os, Point3D &p3){ os << "( " << p3._x << "," << p3._y << "," << p3._z << " )"; return os; } }; int main() { Point2D p2(1,2); Point3D p3 = p2; cout << p2 << endl; cout << p3 << endl; return 0; }
结果为:
显然从Point2D类型成功转换到了Point3D类型。
从例子可以看出,这个类型转换函数其实就是个构造器,并且只有一个参数,这有这样的才称为类型转换构造器,多个参数或没有参数的都只是构造器而已。这里给出类型转换构造器的格式:
目标类{ 目标类(const 源类 & 类名){ 源类转换成目标类的函数体语句 } };
可以看出来,这个类型转换构造器是放在目标类里面的,同时不要忘了因为目标类可能要访问源类的私有成员,那就得把目标类声明为源类的友元类,当然也可以只把类型转换构造器声明为源类的友元函数,就是格式比较麻烦,说友元时(C++之友元)已经详细说明了,这里就不重复解释了。
二、类型转换操作符函数
还是先举个例子,上面是把Point2D转换成Point3D,这次把Point3D转换成Point2D:
class Point2D{ private: int _x; int _y; public: Point2D(int x = 0, int y = 0):_x(x), _y(y){} friend ostream& operator<<(ostream& os, Point2D &p2){ os << "( " << p2._x << "," << p2._y << " )"; return os; } }; class Point3D{ private: int _x; int _y; int _z; public: Point3D(int x = 0, int y = 0, int z = 0):_x(x), _y(y), _z(z){} friend ostream& operator<<(ostream& os, Point3D &p3){ os << "( " << p3._x << "," << p3._y << "," << p3._z << " )"; return os; } operator Point2D(void){ //类型转换操作符函数 return Point2D(this->_x, this->_y); } }; int main() { Point3D p3(1,2,3); Point2D p2 = p3; cout << p3 << endl; cout << p2 << endl; return 0; }
执行结果:
从例子可以看出源类转换到目标类,是在源类中声明类型转换操作符函数,并且,无参无返回,却有return(不要问为什么,甲鱼臀部的规定,你懂得),下面给出类型转换操作符函数的格式:
源类{ operator 目标类(void){ 源类转换目标类的函数体语句 } };
三、explicit
explicit 是个仅用于声明的关键字,表示必须使用显示方式进行类型转换,否则就报错:
explicit Point3D(const Point2D &p2){ this->_x = p2._x; this->_y = p2._y; this->_z = 0; } explicit operator Point2D(void){ return Point2D(this->_x, this->_y); }
现在把类型转换构造器和类型转换操作符函数前面都加了一个explicit的关键字,那么在做类型转换时:
Point2D p2(1,2); Point3D p3 = p2; //编译报错 cout << p2 << endl; cout << p3 << endl; Point3D p31(1,2,3); Point2D p21 = p31; //编译报错 cout << p31 << endl; cout << p21 << endl;
现在就不可以使用隐式转换,就需要改成:
Point3D p3 = (Point3D)p2; Point2D p21 = (Point2D)p31; //或者 Point3D p3 = static_cast<Point3D>(p2); Point2D p21 = static_cast<Point2D>(p31);
这两种格式都可以,关键就要做出显示类型转换,当然如果不声明explicit,类型转换默认都是可以进行隐式类型转换的。
相关文章推荐
- C++学习笔记:int sprintf ( char * str, const char * format, ... );
- C++重载,重写,重定义
- C/C++中的位运算
- C++操作数据库
- C++类使用注意规则
- 6/05/2016函数模板
- C++虚函数表与虚析构函数
- C++第7次实验—函数复习
- C++作业7
- 一个RPC服务客户端代理中间件的设计过程的回顾
- C++第7次上机实验:素数和回文
- C++第7次实验—作业
- C++实验7-特殊三位数
- 构造函数、析构函数、拷贝构造函数小结
- c++作业7
- STL--Lambdas(一)
- STL--Lambdas(二)
- 国外程序员整理的 C++ 资源大全
- 李洪强-C语言7-C语言运算符
- 【C语言】12-指向一维数组元素的指针