C++类类型的转换
来源:互联网 发布:mac开机有个客人用户 编辑:程序博客网 时间:2024/04/25 12:19
说到类型转换,编写过程序的一定不会感到陌生。如:
double d = 3.1415;
int i = 2;
d = d * i;
上面的代码可以正常编译和运行(也许有些编译器会发出警告)。在c++中,对这些不同的内置类型发生运算操作时候,会自动进行类型的匹配。一般是低精度的类型自动匹配到高精度的类型。而对于复杂的类型,如结构体和类,也是存在相类似的系统,只不过要程序员自行定义。假设有类A
class A
{
public:
bool equal(const A& a){ return val == a.val;}
int val;
}
A a;
当遇到如下的语句的时候
a.equal(2); (1)
编译器会发出错误提示,原因是不能把类型int转换成A。但是如果对类A,增加一个构造函数:
public:
A(int a){} (2)
那么语句(1)就可以正常编译通过了。这是因为c++里面,对单个实参的构造函数都有参数类型到类类型的一个隐式转换,所以在增加了(2)之后的(1)的代码,可能就被编译器看成了
a.equal(new A(2)) (3)
在这种情况下可以运行的很好,但是看了许多资料还是建议在单实参前面加上关键字:explicit来说明构造函数只负责初始化而不进行隐式的转换。
反过来说,如果存在以下的语句:
if(2 == a){......} (4)
编译器会报错,原因是==号两边的类型不匹配。当然我们没有告诉编译器类和整型如何比较。但是如果加上
public:
operator int(){return val;} (5)
那么语句(4)就能够通过编译而且能够运行的很好。这是因为(5)告诉编译器类A可以执行到Int行的转换,当编译器到达(4)的时候发现不匹配,就从类A中的方法中寻找,并找到了(5),所以编译成功。类类型到其它类型的转换的格式是: operator type(){} 这里 type可以是除void的任何类型,但是不提倡数组类型或者是函数类型。
类型转换分为以下几种情况
1. 如果需要某类A的类型,传入的类型为B,而A正好有只需要参数B的构造函数,则调用A(B)函数构造一个A
2. 需要A的类型,而当前的类型为B.A也没有只需要参数B的构造函数,则调用B的强制类型转换函数operator A(),强制转换B.否则就出错。
3. 派生类的指针和引用不用强制转换就可以当成基类的使用。其他强制类型的转换除非自己保证否则不一定正确。
4. 类型转换里面临时的常量可以作为const引用使用,临时常量可以作为变量使用。但是用const修饰了的量不能使用在没有用const修饰的地方。简单地说就是const不可以转换为非const,但是非const可以转换为const。const类型的类只能调用自己的const修饰的函数。
- C++:类的自动转换和强制类型转换
- C#.NET 的 类型转换
- C语言的类型转换
- C语言的类型转换
- C语言的类型转换
- c语言的类型转换
- C++/C指针的类型转换
- C#——自定义类的类型转换
- <C/C++> 类型转换
- C/C++:类型转换
- C语言里的指针类型转换
- C#问题--如何转换数组的类型
- C语言类型转换的原则
- c语言的自动类型转换
- c语言的自动类型转换
- C语言的常用类型转换函数
- c语言的自动类型转换
- 【C#】中Decimal类型转换的问题
- 网页对话框showModalDialog
- 接到前前老板给我推荐工作的电话
- basepage
- 关于inline 导致链接失败!
- 预防肝癌的最佳美食
- C++类类型的转换
- Handling workloads on SQL Server 2008 with Resource Governor
- Error spawning 'cmd.exe' 编译问题
- Google Chrome 源码下载地址 (Google Chrome Source Code Download)
- CSDN 2009中国软件技术英雄会(北京站) 之 我评的奖
- 申明
- MISRA C指导指南解读系列2(MISRA 规则 1- 10)
- Window平台---IPSEC客户端的安装
- 巧用SQL的全局临时表防止用户重复登录