栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C++转换函数(operator typeName())与规范

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C++转换函数(operator typeName())与规范

一.转换函数转换类

通常在将double类型的数字变成int类的时候,我们会使用强制转换。如下所属。

double a = 12.23;
cout<< int (a)< 

如果我们想将一个类转换成数字呢?匪夷所思,但是可以。我们定义一个Stone类,即石头,储存其重量

class Stone{
private:
    double weight;
public:
    Stone(double a)
{
    weight = a;
}
    operator int()
{
    return int (weight);
}
#include 
#include "Stone.h"
using namespace std;
void test01();
int main() {

    test01();

    return 0;
}
void test01()
{
    Stone s = 10.2;
    cout<< int(s);
}

如此,便可将一个类转换成数字了。

注意点:

        1.转换函数必须是类方法;

        2.转换函数不能制定返回类型;

        3.转换函数不能有参数;

        4.虽然没有制定类型,但是在实现的时候是需要return 值的。

二.自动应用类型转换(二义性)
void test01()
{
    Stone s = 10.2;
    cout<< s;
}

隐式转换:

这里并没有使用转换函数将s对象转换成int类,直接就输出了s,得到的是10.因为在类的定义中只有这一条匹配,就自动使用了转换函数。但是在类中若有多个转换函数则不能自动转换了,因为存在了二义性。

Stone::operator char() {
    return  char(weight);
}

在类的实现中插入了这么一条的话,上面的cout< 三.隐式转换的危害以及防范(explict)

      在上文中说明了转换函数的隐式函数的用法,可能会感觉很方便,能够使程序员随心所欲的操作,但是这种操作可能会带来一些危害,而在大型工作中,我们更希望有严格与健壮的代码。危害如下所示:

int arr[20];
....我写啊写代码
Stone temp(13.2);
....我写阿写代码,加班好困好困
int Temp =1;
....我还在写,困死了
cout<

看懂了吧,这种情况是可能出现的,因为我们通常用编辑器自动补全,我们觉得编辑器是知道他们的类型的,所以就按回车了。结果输入的是temp被自动转换成数字13了,从而输出了arr[13]而不是我们想要输出的arr[1];

因此可以使用关键字explict,在C++98中该关键字不能用于转换函数,但是在C++11中消除了这种限制,可以将转换运算符声明为显式的。

这样一来就好多了,安全可靠,真好。

class Stone {
private:
    double weight;
public:
    Stone(double a);
   explicit operator int();
};

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/778992.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号