当前位置:  编程技术>c/c++/嵌入式

c++类的隐式转换与强制转换重载详解

    来源: 互联网  发布时间:2014-10-19

    本文导语:  在写这篇文章之前,让我们先回顾一下编译器通过匹配过程确定调用哪一个函数的匹配顺序:(1)寻找和使用最符合函数名和参数类型(包括返回值)的函数,若找到则调用;(2)否则,寻找一个函数模板,将其实例化产生...

在写这篇文章之前,让我们先回顾一下编译器通过匹配过程确定调用哪一个函数的匹配顺序:
(1)寻找和使用最符合函数名和参数类型(包括返回值)的函数,若找到则调用;

(2)否则,寻找一个函数模板,将其实例化产生一个匹配的重载函数,若找到则调用;

(3)否则,寻找可以通过类型转换进行参数匹配的重载函数,若找到则调用它。

如果以上步骤均未找到匹配函数,则这个调用是错误的;如果这个调用有多于一个的匹配选译,则调用匹配出现二义性,也是错误的。
 
类型转换是将一种类型的值映射为另一种类型的值。类型转换实际上包含有自动隐含和强制的两种。

C语言编译系统提供的内部数据类型的自动隐式转换规则如下:

1.程序在执行算术运算时,低类型可以转换为高类型。

2.在赋值表达式中,右边表达式的值自动隐式转换为左边变量的类型,并赋值给它。

3.当在函数调用时,将实参值赋给形参,系统隐式地将实参转换为形参的类型后,赋给形参。

4.函数有返回值时,系统将自动地将返回表达式类型转换为函数类型后,赋值给调用函数。

在以上情况下,系统会进行隐式转换的。当在程序中发现两个数据类型不相容时,又不能自动完成隐式转换,则将出现编译错误。例如:
   int* p = 100;
在这种情况下,编译程序将报错,为了消除错误,可以进行如下所示的强制类型转换:
   int* p = (int *)100;
将整型数100显式地转换成指针类型。

构造函数具有类型转换功能

在实际应用中,当类定义中提供了单个参数的构造函数时,该类便提供了一种将其他数据类型的数值或变量转换为用户所定义数据类型的方法。因此,可以说单个参数的构造函数提供了数据转换的功能。下面通过一个例子进一步说明单参数构造函数的类型转换功能。

代码如下:

#include
classA
{
public:
A(){ m=0; }
A(doublei) { m=i; }
voidprint() { coutGetItem(nCol)->Value= (_bstr_t)sValue;
上面Value是COM的变体类型,“Value=”将引起operator= (_bstr_t)被调用。如果上面省略(_bstr_t),编译器将发生错误,因为没有operator= (char*)这样的重载,编译器不会为我们进行两次以上的隐式转换。

在函数调用过程中,运算符重载和构造也是一个函数调用,如果匹配的函数如无二义性,那么将可以产生一次隐式转换。如果上句的Value变体类只有一个operate= (_bstr_t),那么既使这样写->Value= sValue; 编译器也会试图将sValue隐式转换为_bstr_t类型。

还有一种情况
代码如下:

classA
{
inta;
public:
A(){ };
A(int_a) { a = _a; };
Operatorint() { return a; }
}

有如下调用:
代码如下:

Aa(10);
Aa2 = (int)(int)a;   //只相当于Aa2 = (int)a; 因为第一个就近已经转成了int,第二//个就不用再转了

比较有意思吧,A类既有将int隐式转换A的构造,也有int()转换函数供强制转换,(int)(int)a将以就近原则的方式进行。如果就近转换失败,编译器将报错。比如:
代码如下:

classB
{
};
Aa2 = (B)a;

Aa2 = (B)10;

编译器报这样的错误:"errorC2440: “类型转换”:无法从“int”转换为“B”"
可知,我们自己编写的构造和转换函数多么重要。

转换函数
转换函数又称类型强制转换成员函数,它是类中的一个非静态成员函数。它的定义格式如下:
代码如下:

   class
    {
     public:
      operator();
      …
    }

这个转换函数定义了由到之间的映射关系。可见,转换函数是用来将一种类型的数据转换成为另一种类型。下面通过一个例子说明转换函数的功能。
代码如下:

#include

classRational
{
public:
Rational(intd, int n)
{
den= d;
num= n;
}
operatordouble();//类型转换函数
private:
intden, num;
};

Rational::operatordouble()
{
returndouble(den)/double(num);
}

voidmain()
{
Rationalr(5, 8);
doubled = 4.7;
d+= r;  //这句将调用隐式转换,相当于d= (double)r;
cout

    
 
 

您可能感兴趣的文章:

  • 标准c++四种强制类型转换方式介绍
  • unix下的C++程序转换为可以在windows下的C++
  • windows 和linux 之间的文本文件转换 c和c++文件 批量转换
  • 深入C++四种强制类型转换的总结
  • 怎样将标准的C++代码转换成JAVA代码??
  • Java到C++的转换工具 J2cpp
  • Python到C++的转换工具 ShedSkin
  • c++ 将buffer转换成raw string的函数
  • 关于C++数据类型转换的问题
  • 利用C++实现从std::string类型到bool型的转换
  • 解决C++ 无法从void 转换为LRESULT的方法详解
  • Linux下C++字符串如何转换为iso-8859-1编码格式?急!急!
  • c++实现十进制转换成16进制示例
  • 请问,LINUX的C++中,如何将string类型与char数组一次性互相转换?
  • 用c++实现将文本每个单词首字母转换为大写
  • C++ 十进制转换为二进制的实例代码
  • linux 系统下c++ 用expat解析xml文件发生的字符编码转换的问题gbk---->utf-8
  • C++联合体转换成C#结构的实现方法
  • C++多字节字符与宽字节字符相互转换
  • c++与c#的时间转换示例分享
  • 基于C++浮点数(float、double)类型数据比较与转换的详解
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • linux c/c++ IP字符串转换成可比较大小的数字
  • php时区转换转换函数
  • Linux c字符串中不可打印字符转换成16进制
  • 字符串如何转换为整数,如"12345"(是字符串)转换为12345
  • mysql中字符串和时间互相转换的方法(自动转换及DATE_FORMAT函数)
  • 怎么将一个字符串类型转换为整型,比如说将“123”转换为123
  • Python将日期时间按照格式转换成字符串
  • 哪位大哥大姐知道结果集中的日期类数据在输出显示时应转换为什么类型的数据,怎么转换?
  • Python3中内置类型bytes和str用法及byte和string之间各种编码转换
  • C语言中自动隐式转换与类型强制转换实例分析
  • 对TCP协议状态及状态转换理解
  • 请问能否把任何类型数据转换为一种类型,然后从这种类型又转换回去?例如:int>>Object Object>>int
  • PHP实现Unicode和Utf-8互相转换
  • java中如何将ascII 码转换成字符以及将字符转换成ascII码? 在线等待加分!
  • php将标准字符串格式时间转换成unix时间戳_strtotime
  • Linux下C++字符串如何转换为iso-8859-1编码格式?急!急! iis7站长之家
  • php将html特殊字符转换成html字符串的函数:htmlspecialchars()介绍及代码举例
  • 如何实现float 到 int 的类型转换,string 到 int 的类型转换?
  • php将unix时间戳转换成字符串时间函数(date)
  • 如何实现mbcs转换unicode,unicode转换成utf8
  • HTML 特殊字符及预留字符转换成字符实体
  • asp.net字符串转换 123456789转换为12-345-6789的3种方法




  • 特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3