广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >c++类的隐式转换与强制转换重载详解
  • 212
分享到

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

隐式转换强制转换c++ 2022-11-15 22:11:36 212人浏览 八月长安
摘要

在写这篇文章之前,让我们先回顾一下编译器通过匹配过程确定调用哪一个函数的匹配顺序:(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() { cout<<M<
private:
doublem;
};

voidmain()
{
Aa(5);
a=10; //a与10是不同的数据类型
a.print();
}

程序的输出结果为:
  10
在该程序中,赋值语句a=10;中,赋值号两边数值10和对象a是两上不相容的数据类型,可是它却能顺利通过编译程序,并且输出显示正确结果,其主要原因是得益于单参数的构造函数。编译系统选通过标准数据类型转换,将整型数值10转换成double型,然后,再通过类中定义的单参数构造函数将double型数值转换为A类类型,最后把它赋值给a。这些转换都是自动隐式完成的。

关于上面的程序,补充一点:
Aa = 10;

Aa;
a= 10;
两者是不同的,前者对a进行初使化,编译器会尝试将10隐式转换为A类型,这样将引起a的A(doublei)构造函数直接被调用。
后者属于赋值语句,编译器将建立一个临时对象,并将10隐式转换为A类型。如果我们显示调用
(A)10;
这也将建立一个临时对象,引起A的构造函数被调用。

还有一点要注意,编译器只会进行一次隐式转换(C时刻库的内置类型如intshort char等)除外,下面的语句说明了这点:
m_rst->GetFields()->GetItem(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<类型说明符1>
    {
     public:
      operator<类型说明符2>();
      …
    }

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

#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<<d<<ENDL;
}

程序输出结果:
5.325

由程序可知,d是一个double型数值,r是Rational类的对象,这两个不同类型的数据进行加法之所以能够进行是得益于转换函数operatordouble()。为使上述加法能够进行,编译系统先检查类Rational的说明,看是否存在在下转换函数能够将Rational类型的操作数转换为double类型的操作数。由于Rational类中说明了转换函数operatordouble(),它可以在程序运行时进行上述类型转换,因此,该程序中实现了d=r;的操作。

定义转换函数时应注意如下几点:
(1)转换函数是用户定义的成员函数,但它要是非静态的。
(2)转换函数的不可以有返回值。(意思是声明中不可以有返回值)
(3)转换函数也不带任何参数。
(4)转换函数函数还不能定义为友元函数。

转换函数的名称是类型转换的目标类型,因此,不必再为它指定返回值类型;转换函数是被用于本类型的数值或变量转换为其他的类型,也不必带参数。

类中的构造函数完成其他类型到类类型的转换,而重载强制转换完成类类型到其他类型的转换。

--结束END--

本文标题: c++类的隐式转换与强制转换重载详解

本文链接: https://www.lsjlt.com/news/172503.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • c++类的隐式转换与强制转换重载详解
    在写这篇文章之前,让我们先回顾一下编译器通过匹配过程确定调用哪一个函数的匹配顺序:(1)寻找和使用最符合函数名和参数类型(包括返回值)的函数,若找到则调用;(2)否则,寻找一个函数模...
    99+
    2022-11-15
    隐式转换 强制转换 c++
  • JavaScript中类型的强制转换与隐式转换详解
    目录一、隐式转换双等号里的转换 Boolean 类型转换 "+" 与 "-" 二、强制类型转换 new String 与 ' ' 总结一、隐式转换 以下语句的执行结果是什么? A...
    99+
    2022-11-12
  • C语言基础隐式类型转换与强制类型转换示例解析
    目录类型转换隐式类型转换强制类型转换类型转换 数据有不同的类型,不同类型数据之间进行混合运算时必然涉及到类型的转换问题。 转换包括隐式类型转换和强制类型转换。 类型转换的原则:占用内...
    99+
    2022-11-12
  • C++ 强制类型转换详解
    目录一、C强制转换二、C++强制转换1、static_cast 静态转换(编译时检查)2、const_cast 常量转换3、reinterpret_cast 重新解释转换4、dyna...
    99+
    2022-11-12
  • C语言隐式类型转换与强制类型转换的方法是什么
    本篇内容主要讲解“C语言隐式类型转换与强制类型转换的方法是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C语言隐式类型转换与强制类型转换的方法是什么”吧!类型转换数据有不同的类型,不同类型数...
    99+
    2023-06-25
  • C#数据类型转换(显式转型、隐式转型、强制转型)
    C# 的类型转换有显式转型 和 隐式转型 两种方式。 显式转型:有可能引发异常、精确度丢失及其他问题的转换方式。需要使用手段进行转换操作。隐式转型:不会改变原有数据精确度、引发异常,...
    99+
    2022-11-12
  • C++超详细讲解强制类型转换
    目录1 C 强制类型转换2 C++ 强制类型转转1 C 强制类型转换 C 方式的强制类型转换的用法如下代码所示: (Type)(Expression) Type:需要转换成的类型Ex...
    99+
    2022-11-13
  • C++中的强制类型转换操作详解
    目录相关术语C语言中的强制类型转换C++中的强制类型转换static_castdynamic_castreinterpret_castconst_cast注意事项相关术语 强制类型转...
    99+
    2023-05-17
    C++强制类型转换 C++类型转换
  • 详解C#如何实现隐式类型转换
    目录预期效果static using 与 global using隐式类型转换实现 Result 类型Result 类型是许多编程语言中处理错误的常用方式,包括 C# 的 dotNe...
    99+
    2023-01-05
    C#实现隐式类型转换 C#隐式类型转换 C# 类型转换
  • C++强制类型转换的四种方式
    目录1 C++类型转换本质1.1 自动类型转换(隐式)1.2 强制类型转换(显式)1.3 类型转换的本质1.4 类型转换的安全性2 四种类型转换运算符2.1 C语言的强制类型转换与C...
    99+
    2022-11-13
  • C#强制类型转换与泛型怎么理解
    本篇内容主要讲解“C#强制类型转换与泛型怎么理解”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C#强制类型转换与泛型怎么理解”吧!C# 强制类型转换和普通对象一样,泛型类的对象也可以采用强制类型...
    99+
    2023-06-17
  • JavaScala的隐式转换详解
    目录一、隐式值与隐式参数二、隐式转换函数三、隐式类隐式转换是在Scala编译器进行类型匹配时,如果找不到合适的类型,那么隐式转换会让编译器在作用范围内自动推导出来合适的类型。 一、隐...
    99+
    2023-05-17
    Java Scala的隐式转换 Scala隐式转换
  • C++强制类型转换的方法
    今天小编给大家分享一下C++强制类型转换的方法的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。1 C 强制类型转换C 方式的强...
    99+
    2023-06-30
  • C++超详细讲解强制类型转换的用法
    目录static_castdynamic_castconst_castreinterpret_caststatic_cast static_cast<type-id>(e...
    99+
    2022-11-13
  • go类型转换及与C的类型转换方式
    GO类型转换及与C的类型转换 类型转换 语法 dst := float32(src) 示例 var num int = 520 f32 := float32(num) i6...
    99+
    2022-06-07
    GO
  • C++强制类型转换的方式有哪些
    本篇内容主要讲解“C++强制类型转换的方式有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C++强制类型转换的方式有哪些”吧!1 C++类型转换本质1.1 自动类型转换(隐式)利用编译器内置...
    99+
    2023-06-30
  • JavaScript隐式类型转换规则详解
    目录前言数学运算符中的类型转换减、乘、除加逻辑语句中的类型转换单个变量使用 == 比较ToPrimitive前言 在 JavaScript 中,在进行运算操作时,如果两边数据不统一,...
    99+
    2023-05-18
    JavaScript 隐式类型转换 JavaScript 类型转换规则
  • C++的类型转换(强转)你了解吗
    目录静态类型转换动态类型转换常量转换重新解释转换总结静态类型转换 关键字: static_cast 1,允许内置数据类型之间的转换 char a = 'a'; d...
    99+
    2022-11-13
  • C语言强制类型转换规则实例详解
    目录整形之间的强制转换无符号转有符号有符号转无符号不同长度数字转化中的截断整形与浮点数的强制类型转换总结整形之间的强制转换 在强制类型转换中,我们常用的整形强制转换有无符号和有符号类...
    99+
    2022-11-13
  • C++ 的类型转换详解
    目录一、C++ 类型转换1.静态类型转换1.语法格式2.转化规则 2.重解释类型转换1.语法格式2.转化规则 3.常类型转换1.语法格式2.语法规则 3.const 常变量(补充) ...
    99+
    2022-11-12
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作