我的编程空间,编程开发者的网络收藏夹
学习永远不晚

C++中类的转换函数怎么用

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

C++中类的转换函数怎么用

今天小编给大家分享一下C++中类的转换函数怎么用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。

只有接受一个参数(其他参数有默认值的也算)的构造函数才能作为转换构造函数

在C++中,接受一个参数的构造函数为将类型与该参数相同的值转换为类提供了蓝图。因此,下面的构造函数用于将double类型的值转换为Stonewt类型:

Stonewt(double lbs) // double转Stonewt的模板

也就是说,可以编写这样的代码:

Stonewt myCat; // 创建一个Stonewt对象myCat = 19.6; // 使用Stonewt(double)将19.6转换为Stonewt对象

这一过程称为隐式转换,因为它是自动进行的,而不需要显式强制类型转换。

将构造函数用作自动类型转换似乎是一项不错的特性。然而,当程序员拥有更丰富的C++经验时,将发现这种自动特性并非总是合乎需要的,因为这会导致意外的类型转换。因此,C++新增了关键字explicit,用于关闭这种自动特性。也就是说,可以这样声明构造函数:

explicit Stonewt(double lbs) // 不允许隐式转换

这将关闭上述示例中介绍的隐式转换,但仍然允许显式转换,即显式强制类型转换:

Stonewt myCat;myCat = 19.6; // 不允许,因为Stonewt(double)声明为explicitmyCat = Stonewt(19.6); // OK,一个显示地转换myCat = (Stonewt)19.6; // OK,原始地显示类型转换

编译器在什么时候将使用Stonewt(double)函数呢?

如果在声明中使用了关键字explicit,则Stonewt(double)将只用于显式强制类型转换,否则还可以用于下面的隐式转换:

  • 将Stonewt对象初始化为double值时。如:Stonewt st(1.23);

  • 将double值赋给Stonewt对象时。如:Stonewt st; st = 1.23;

  • 将double值传递给接受Stonewt参数的函数时。如:display(Stonewt& st);-> display(1.23);

  • 返回值被声明为Stonewt的函数试图返回double值时。如:Stonewt& go(){ return 1.23; }

  • 在上述任意一种情况下,使用可转换为double类型的内置类型时。如:Stonewt& go() { return 123; }

可以将数字转换为Stonewt对象。可以做相反的转换吗?也就是说,是否可以将Stonewt对象转换为double值,就像如下所示的那样?

Stonewt wolfe(285.7);double host = wolfe;// ??可以吗??

可以这样做,但不是使用构造函数。构造函数只用于从某种类型到类类型的转换。要进行相反的转换,必须使用特殊的C++运算符函数——转换函数。

转换函数是用户定义的强制类型转换,可以像使用强制类型转换那样使用它们。例如,如果定义了从Stonewt到double的转换函数,就可以使用下面的转换:

Stonewt wolfe(285.7);double host = double (wolfe);    // syntax #1double thinker = (double) wolfe; // syntax #2也可以让编译器来决定如何做:Stonewt wells(20, 3);double star = wells; // 隐式使用转换函数

编译器发现,右侧是Stonewt类型,而左侧是double类型,因此它将查看程序员是否定义了与此匹配的转换函数。(如果没有找到这样的定义,编译器将生成错误消息,指出无法将Stonewt赋给double。)

创建一个转换函数,转换为typeName类型,需要使用这种形式的转换函数:

operator typeName();// 无返回类型,无参数

请注意以下几点:

  • 转换函数必须是类方法

  • 转换函数不能指定返回类型

  • 转换函数不能有参数

在类的头文件定义:

operator int() const;operator double() const;

实现代码:

......// construct Stonewt object from stone, double valuesStonewt::Stonewt(int stn, double lbs) {stone = stn;pds_left = lbs;pounds = stn * Lbs_per_stn + lbs;}......// conversion functionsStonewt::operator int() const {return int(pounds + 0.5);}Stonewt::operator double() const {return pounds;}

使用:

Stonewt poppins(9, 2.8);// 9 stone, 2.8 poundsdouble p_wt = poppins;// implicit conversioncout << "Convert to double => ";cout << "Poppins: " << p_wt << " pounds.\n";cout << "Convert to int => ";cout << "Poppins: " << int(poppins) << " pounds.\n";
Convert to double => Poppins: 128.8 pounds.Convert to int => Poppins: 129 pounds.

原则上说,最好使用显式转换,而避免隐式转换。在C++98中,关键字explicit不能用于转换函数,但C++11消除了这种限制。因此,在C++11中,可将转换运算符声明为显式的:

class Stonewt {    ...    // 转换函数    explicit operator int() const;    explicit operator double() const;};

有了explicit声明后,在显式强制转换时才调用这些运算符。

另一种方法是,用一个功能相同的非转换函数替换该转换函数即可,但仅在被显式地调用时,该函数才会执行。也就是说,可以将:

Stonewt::operator int() { return int (pounds + 0.5); }替换为:int Stonewt::Stone_to_Int() { return int (pounds + 0.5); }

这样,下面的语句:

int plb = poppins; // 非法int plb1 = (int) poppins;// 合法int plb2 = int(poppins);// 合法int plb3 = poppins.Stone_to_Int(); // 合法

应谨慎地使用隐式转换函数。通常,最好选择仅在被显式地调用时才会执行的函数。

以上就是“C++中类的转换函数怎么用”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注编程网行业资讯频道。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

C++中类的转换函数怎么用

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

下载Word文档

猜你喜欢

C++中类的转换函数怎么用

今天小编给大家分享一下C++中类的转换函数怎么用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。只有接受一个参数(其他参数有默
2023-06-29

C++中怎么强制类型转换函数

本篇文章给大家分享的是有关C++中怎么强制类型转换函数,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。1)static_cast(a)将地址a转换成类型T,T和a必须是指
2023-06-17

C#中怎么自定义类型转换函数

C#中怎么自定义类型转换函数,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。/// /// 将字符型类型转换为整型值 ///
2023-06-18

C++ 函数参数类型的转换规则

c++++ 函数参数类型转换规则包括: 无符号类型转换为有符号类型、精度低的类型转换为精度高的类型、浮点类型之间的转换、兼容的指针类型之间转换。实战案例:可以传递无符号整数、精度低的整数和浮点类型作为参数,编译器会隐式转换为相应类型。C++
C++ 函数参数类型的转换规则
2024-04-13

php类型转换函数怎么使用

这篇文章主要介绍“php类型转换函数怎么使用”,在日常操作中,相信很多人在php类型转换函数怎么使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”php类型转换函数怎么使用”的疑惑有所帮助!接下来,请跟着小编
2023-07-05

c#怎么转换数据类型

在 c# 中,有三种方法可以转换数据类型:隐式转换(用于较小类型转换为较大类型),显式转换(使用强制转换运算符)和类型转换方法(例如 convert.toint32())。显式转换可能导致数据丢失,因此使用时要小心。C# 中如何转换数据类型
c#怎么转换数据类型
2024-05-11

Python转换数据类型函数和转换数据类型的作用是什么

这篇文章给大家分享的是有关Python转换数据类型函数和转换数据类型的作用是什么的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、转换数据类型的作用(必要性)先用一个问题来讲解一下为什么要学习转换数据类型?问题:
2023-06-29

C#中怎么转换变量类型

这篇文章将为大家详细讲解有关C#中怎么转换变量类型,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。1.变量 变量是指在程序的运行过程中随时可以发生变化的量。语法:数据类型 变量名;例如:str
2023-06-17

C# 中怎么对数据类型进行转换

本篇文章给大家分享的是有关C# 中怎么对数据类型进行转换,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。一、函数方法下面罗列的函数方法不是全部,仅列举一些常用的double这种有
2023-06-20

C语言的字符串转换函数怎么用

这篇“C语言的字符串转换函数怎么用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“C语言的字符串转换函数怎么用”文章吧。字符串
2023-06-29

C++中怎么实现类型转换

本篇文章给大家分享的是有关C++中怎么实现类型转换,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。0. 类型转换的原理在进行下面的学习前,我觉得有比较知道不同类型是怎么进行转换的
2023-06-20

golang函数的类型转换

函数中类型转换允许将一种类型的数据转换为另一种类型,从而扩展函数的功能。使用语法:type_name := variable.(type)。例如,可使用 strconv.atoi 函数将字符串转换为数字,并处理转换失败的错误。Go 语言函数
golang函数的类型转换
2024-04-19

C++中Operator类型强制转换成员函数解析

转换函数定义了由<类型说明符1>到<类型说明符2>之间的映射关系。可见,转换函数是用来将一种类型的数据转换成为另一种类型
2022-11-15

c语言中类型转换怎么弄

c 语言中存在两种类型转换:隐式转换(类型提升):当需要将较小的数据类型转换为较大的数据类型时自动发生。显式转换(强制类型转换):用于将较大的数据类型转换为较小的数据类型,通过在变量或表达式前加上要转换到的类型名称实现。C 语言中的类型转换
c语言中类型转换怎么弄
2024-04-13

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录