之前学习的,可以将普通类型转换为类类型,需要借助转换构造函数。那么反过来,类类型可以转换为普通类型吗?

#include <stdio.h>class TestCls{public:int a;TestCls(int x = 0) : a(x){}
};int main(void)
{TestCls t1;int i = t1;printf("i = %d\n", i);return 0;
}

编译报错:

即使加上强制类型转换:

int i = (int)t1;

报错依旧。

一个类类型变量要转换成普通类型,需要借助类的类型转换函数。类型转换函数用于将类对象转换为其它类型,语法规则为:

operator Type()
{Type ret;//...return ret;
}

加入类型转换函数之后:

class TestCls{
public:int a;TestCls(int x = 5) : a(x){}/* 类型转换函数,将TestCls类转换为int类型 */operator int(){return a;}};int main(void)
{TestCls t1;int i = t1;printf("i = %d\n", i);return 0;
}

编译运行:

使用类型转换函数需要注意:
1. 类型转换函数必须是成员函数,不能指定其返回类型,并且形参必须为空,返回值是隐含的,返回值类型是和转换的类型Type是相同的,在本例子中为int。
2. Type表示内置类型名、类类型名或者是类型别名(typedef)。除了void外,任何可作为函数返回类型的类型都可以定义转换函数的目标转换类型。一般不允许转换为数组或函数类型,但是可以转换为指针类型以及引用类型
3. 类型转换函数一般不应该改变被转换的对象,因此转换函数通常属性被定义为const。

int i = t1;能够编译运行,因为调用了类型转换t1对象的类型转换函数operator int()。

类型转换函数用于将类对象转换为其它类型,那么就可以实现将A类类型对象转换成B类类型对象:

class A
{
private:int a;public:A(int x = 0) : a(x){}char value(){return a;}
};class B
{
private:char c;public:B(char y = 0) : c(y){}char value(){return c;}
};int main(void)
{A class_a;B class_b(100);class_a = class_b;printf("class_a.a = %d\n", class_a.value());return 0;
}

两种不同类型的对象相互赋值,必然报错:

B类定义类型转换函数后:

class B
{
private:char c;public:B(char y = 0) : c(y){}char value(){return a;}operator A (){A tmp(c);return tmp;}
};

编译运行正常:

class_a = class_b;其实等价于class_a = class_b.operator int();

在前面我们已经尝试通过转换构造函数的方法,同样可以实现将A类类型对象转换成B类类型对象:

class B;        //前向声明class A
{
private:int a;public:A(int x = 0) : a(x){}A(B& cB){}char value(){return a;}
};class B
{
public:char c;public:B(char y = 0) : c(y){}char value(){return c;}/*operator A (){A tmp(c);return tmp;}*/
};int main(void)
{A class_a;B class_b(100);class_a = class_b;return 0;
}

需要注意,类型转换函数转换的是右值,转换构造函数转换的是左值。

右值的类型转换函数和左值的转换构造函数都可以实现隐式的类型转换,那么如果二者同时存在于代码中,在需要类型转换时,编译器会选择调用谁?

去除代码中的注释编译运行:

编译器因不知道该调用谁而报错。

类型转换函数和转换构造函数具有同等地位,编译器同样能够隐式的使用类型转换函数,在实际项目工程中为了代码的可控性,程序员一般不会使用编译器这个隐式转换功能。explicit关键字可去除转换构造函数的隐式调用,那类型转换函数呢?换个函数名即可,通常函数名为”TypetoTpye()”:

class B
{
public:char c;public:B(char y = 0) : c(y){}char value(){return c;}A toA (){A tmp(c);return tmp;}
};int main(void)
{A class_a;B class_b(100);class_a = class_b.toA();printf("class_a.a = %d\n", class_a.value());return 0;
}

事实上,很多成熟的类库都是这么实现的,如STL、QT等。

c++类的类型转换函数相关推荐

  1. C++中类型转换函数:将当前类的类型转换为其它类型

    1.C++中类型转换函数:将当前类的类型转换为其它类型 转换构造函数能够将其它类型转换为当前类类型(例如将double类型转换为complex类型),但是不能反过来将当前类类型转换为其它类型(例如将c ...

  2. 类型转换函数(三十五)

    我们之前在 C 语言中讲过类型转换,那么在 C++ 中是否还会有什么新特性呢?我们先来看看之前的类型转换是怎样的,标准数据类型之间会进行隐式的类型安全转换.转换规则如下 我们还是以代码为例来进行分析 ...

  3. 关于友元函数,运算符重载和类的类型转换

    一 关于运算符的重载: 运算符中有10种是不可重载的: sizeof static_cast<type> . dynamic_cast<type> .* const_cast& ...

  4. Sql Server函数全解三数据类型转换函数和文本图像函数

    原文:Sql Server函数全解<三>数据类型转换函数和文本图像函数 一:数据类型转换函数 在同时处理不同数据类型的值时,SQL Server一般会自动进行隐士类型转换.对于数据类型相近 ...

  5. FPGA之道(25)VHDL数据类型转换函数与数据对象的属性

    文章目录 数据类型转换函数 数据对象的属性 数值类属性 Signal属性 数据类型转换函数 在VHDL的众多数据类型中,归根到底,它们都是要用二进制数来表示的,所以它们之间几乎都是可以相互转换的.在有 ...

  6. 将类的成员函数作为回调函数(外一篇:友元函数)

    转自:http://blog.csdn.net/xylary/article/details/1548596 将类成员函数用做C回调函数 提出问题:  回调函数是基于C编程的Windows SDK的技 ...

  7. # c++运算符重载之 前置++, 后置++, 负号运算符, 类型转换函数, 以及输入输出运算符...

    c++运算符重载之 前置++, 后置++, 负号运算符, 类型转换函数, 以及输入输出运算符 标签(空格分隔): c++ 前言 我在c++学习的过程中, 对这几个不太常见的运算符重载不太会写.出现了很 ...

  8. C++中的转换构造函数和类型转换函数

    文章目录 1 C++中的转换构造函数 1.1 转换构造函数 1.2 explicit关键字 2 C++中的类型转换函数 2.1 类型转换函数 3 转换构造函数与类型转换函数之间的冲突 3.1 转换构造 ...

  9. str 类常用的函数

    转自: http://blog.csdn.net/jiangnanandi/archive/2008/10/09/3041964.aspx 在python有各种各样的string操作函数.在历史上st ...

最新文章

  1. [SimpleOJ229]隧道
  2. Spring 基于xml配置方式的AOP
  3. HTML语言怎么晋升,学会提问,对你的职场晋升有很大的帮助
  4. linux TCP/IP L2层数据包接收流程,eth_rxnetif_receive_skb处理流程
  5. 【云速建站】SSL证书自助部署
  6. c++ 二维数组_二维数组的声明2019_04_18
  7. 融资12亿后倒闭 这家机器人公司宣布全体裁员
  8. python中重要的基础概念
  9. abaqus编写本构方程vumat_abaqus vumat sdv
  10. deepin安装nginx服务器
  11. 计算机地图制图的优点,计算机地图制图实习报告.doc
  12. 【漏洞复现】Hadoop YARN 资源管理系统 REST API未授权访问
  13. 集成学习-Stacking与Blending与泰坦尼克号特征工程(DataWhale第二期)
  14. matlab 矩阵与向量乘法,性能:Matlab与C矩阵向量乘法
  15. 期货市场的投资者适当性原则
  16. mmdetection安装教程 | 踩坑总结
  17. 面试专题——Redis
  18. 如何安装及使用PuTTY
  19. WIN10底部任务栏卡死解决方案
  20. unity中Avatar换装实现(三)之美

热门文章

  1. allure安装与使用
  2. 业务元数据管理——洞悉数据背后的业务含义
  3. Hardfault调试方法(调试技术)
  4. 电脑提示d3dcompiler_47.dll缺失怎么修复?
  5. MySQL 锁(二):间隙锁笔记
  6. 如果是有意隐藏,请使用关键字 new。
  7. (实测)Discuz修改论坛最后发表的帖子的链接为静态地址
  8. java基于ssm开发的弹幕视频网站源码
  9. 自己编一个大乐透选号器
  10. lougu T7983 大芳的逆行板载