广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C++中类的转换函数你了解吗
  • 205
分享到

C++中类的转换函数你了解吗

2024-04-02 19:04:59 205人浏览 泡泡鱼
摘要

只有接受一个参数(其他参数有默认值的也算)的构造函数才能作为转换构造函数。 在c++中,接受一个参数的构造函数为将类型与该参数相同的值转换为类提供了蓝图。因此,下面的构造函数用于将d

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

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)声明为explicit
myCat = 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 #1
double 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 values
Stonewt::Stonewt(int stn, double lbs) {
	stone = stn;
	pds_left = lbs;
	pounds = stn * Lbs_per_stn + lbs;
}
......
// conversion functions
Stonewt::operator int() const {
	return int(pounds + 0.5);
}
Stonewt::operator double() const {
	return pounds;
}

使用:

Stonewt poppins(9, 2.8);// 9 stone, 2.8 pounds
double p_wt = poppins;// implicit conversion
cout << "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(); // 合法

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

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注编程网的更多内容! 

 

--结束END--

本文标题: C++中类的转换函数你了解吗

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

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

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

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

下载Word文档
猜你喜欢
  • C++中类的转换函数你了解吗
    只有接受一个参数(其他参数有默认值的也算)的构造函数才能作为转换构造函数。 在C++中,接受一个参数的构造函数为将类型与该参数相同的值转换为类提供了蓝图。因此,下面的构造函数用于将d...
    99+
    2022-11-13
  • C++的类型转换(强转)你了解吗
    目录静态类型转换动态类型转换常量转换重新解释转换总结静态类型转换 关键字: static_cast 1,允许内置数据类型之间的转换 char a = 'a'; d...
    99+
    2022-11-13
  • TypeScript中的函数和类你了解吗
    目录函数作为参数定义函数函数参数的类型可选类型参数默认值剩余参数this的默认推导函数重载类初始化继承多态成员修饰符总结函数 以下声明了一个函数类型,通过type来定义类型别名,vo...
    99+
    2022-11-13
  • C++中的函数你真的理解了吗
    目录1 概述2 函数的定义及调用3 值传递4 函数的常见形式5 函数的声明6 函数的分文件编写作用:让代码结构更加清晰1.2.3.4.总结1 概述 作用:将一段经常使用的代码进行封装...
    99+
    2022-11-13
  • C++的内联函数你了解吗
    目录1.概念2.函数演示3.函数特性总结1.概念 以inline修饰的函数叫做内联函数,编译时C++编译器会在调用内联函数的地方展开,没有函数压栈的开销,内联函数提升程序运行的效率。...
    99+
    2022-11-13
  • 一文带你深入了解C++中的类型转换
    目录C语言中的类型转换为什么C++需要四种类型转换C++强制类型转换static_castreinterpret_castconst_castdynamic_castC语言中的类型转...
    99+
    2022-12-27
    C++ 四种类型转换 C++ 类型转换
  • C++inline函数的特性你了解吗
    目录一.inline的作用(内联函数)二.inline的实现(注意debug模式下内联函数不会展开)三.使用inline的注意事项四.inline和预处理的区别总结一.inline的...
    99+
    2022-11-13
  • C语言的strcpy函数你了解吗
    目录strcpy函数原型参数讲解返回值详解函数详解第二个注意点:目标空间必须足够大,以确保能存放源字符串第三个注意点:目标空间必须可变总结strcpy 拷贝字符串到目标地址 函数原...
    99+
    2022-11-13
  • Python的进制转换和ASCLL转换你了解吗
    目录进制转换1. 十进制与二进制1.1 十进制转二进制1.2 二进制转十进制2. 十进制与八进制2.1 十进制转八进制3. 十进制与十六进制3.1 十进制转十六进制3.2 十六进制转...
    99+
    2022-11-13
  • C++的数据类型你真的了解吗
    目录前言1 整型2 sizeof关键字3 实型(浮点型)4 字符型5 转义字符6 字符串型7 布尔类型 bool8 数据的输入总结前言 C++不像python,创建变量的时候必须指定...
    99+
    2022-11-13
  • C++的拷贝构造函数你了解吗
    目录一般情况下的拷贝构造函数:默认拷贝构造函数:浅拷贝和深拷贝:总结拷贝构造函数用以将一个类的对象拷贝给同一个类的另一个对象,比如之前学习过的string类: string s1; ...
    99+
    2022-11-13
  • C++的多态与虚函数你了解吗
    目录多态性虚函数总结多态性 多态性是面向对象程序设计的关键技术之一,若程序设计语言不支持多态性,不能称为面向对象的语言,利用多态性技术,可以调用同一个函数名的函数,实现完全不同的功能...
    99+
    2022-11-13
  • C语言的abs()函数和div()函数你了解吗
    C语言库中提供了许多函数,这样需要计算的时候,可以直接借助库函数,而不用自己重新编写函数。今天就来看一下C语言标准库函数里面的整型函数。 int __cdecl abs(int ...
    99+
    2022-11-13
  • C++中类的转换函数怎么用
    今天小编给大家分享一下C++中类的转换函数怎么用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。只有接受一个参数(其他参数有默...
    99+
    2023-06-29
  • JavaScript基本数据类型转换你了解嘛
    目录前言转换为数字Number(string)方法parseInt(string,radix)parseFloat(string)隐式转换转换为字符串toString()String...
    99+
    2022-11-13
  • C++的多态和虚函数你真的了解吗
    目录一、C++的面试常考点二、阿里真题2.1 真题一(1)虚函数表vtbl(2)构造一个派生类对象的过程(3)析构一个派生类对象的过程2.2 真题二2.3 真题三2.4 真题四2.5...
    99+
    2022-11-13
  • 带你了解C++中的sort函数
    目录sort( ) char型数组char型数组总结sort( ) 使用方法: sort(首元素地址(必填),尾元素地址的下一个地址(必填),比较函数(非必填)) 必须加上头文件...
    99+
    2022-11-12
  • JavaScript变量类型以及变量之间的转换你了解吗
    目录1. 变量类型1.1 变量类型的颜色2. 字面量3.数据类型转换3.1. 转换为字符串型1.加号拼接字符串2.toString() 转成字符串3.string(变量)3.2转换为...
    99+
    2022-11-13
  • python的函数参数你了解吗
    目录前言位置传参关键字传参默认参数不定长参数混合使用问题创建时引用时总结前言 python参数类型和参数传递形式多样,相对于其他语言python使用会更加灵活。它传参形式一般分为两种...
    99+
    2022-11-13
  • C++图文并茂讲解类型转换函数
    目录一、类型转换函数(上)1.再论类型转换2.问题3.再论构造函数4.另一个视角5.编译器的行为6.小结(上) 二、类型转换函数(下)1.类型转换2.编译器的行为3.注意事...
    99+
    2022-11-13
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作