C++之运算符重载

C++预定义中的运算符的操作对象只限于基本的内置数据类型,但是对于我们自定义的类型(类)是没有办法操作的,但是大多时候我们需要对我们定义的类型进行类似的运算,这个时候就需要我们对运算符进行重新定义,赋

大家好,又见面了,我是全栈君,今天给大家准备了Idea注册码。

全栈程序员社区此处内容已经被作者隐藏,请输入验证码查看内容
验证码:
请关注本站微信公众号,回复“验证码”,获取验证码。在微信里搜索“全栈程序员社区”或者“www_javaforall_cn”或者微信扫描右侧二维码都可以关注本站微信公众号。

  C++预定义中的运算符的操作对象只限于基本的内置数据类型,但是对于我们自定义的类型(类)是没有办法操作的,但是大多时候我们需要对我们定义的类型进行类似的运算,这个时候就需要我们对运算符进行重新定义,赋予其新的功能,以满足自身的需求

运算符重载规则

  (返回类型说明符) operator(运算符) (<参数表>)

  (1)为了防止对标准类型进行运算符重载,C++规定重载后的运算符的操作对象必须至少有一个是用户定义的类型

  (2)使用运算符不能违反运算符原来的句法规则

  (3)不能修改运算符原来的优先级

  (4)不能创建一个新的运算符

  (5)不能进行重载的运算符:成员运算符,作用域运算符,条件运算符,sizeof运算符,const_cast、dynamic_cast、reinterpret_cast、static_cast强制类型转换运算符

  (6)大多数运算符可以通过成员函数和非成员函数进行重载但是下面这四种运算符只能通过成员函数进行重载: =赋值运算符,()函数调用运算符,[ ]下标运算符,->通过指针访问类成员的运算符。

自动类型转换

  在C和C++中,如果编译器看到一个表达式或函数使用了一个不合适的类型,它经常会执行自动类型转换。在C++中,可以通过定义自动类型转换函数来为用户定义类型达到相同效果。这些函数有两种类型,分别为特殊类型的构造函数和重载运算符。

构造类型转换

// 测试构造函数的自动类型转换
class one
{
public:
    one() {}
};

class two
{
public:
    two(const one&){}
};

void f(two){}

void main()
{
    one ONE;
    f(ONE);
    return;
}

  当编译器看到f()传入的是one对象时,编译器检查f()的声明并注意到它需要一个two的对象作为参数,然后编译器检查是否有从对象one到two的方法,它发现了构造函数two::two(const one&),该构造函数被悄悄的调用,结果对象two()被传给f()

  若要阻止构造函数转换,可以通过explicit关键字来修改构造函数

// 测试构造函数的自动类型转换
class one
{
public:
    one() {}
};

class two
{
public:
    explicit two(const one&){}
};

void f(two){}

void main()
{
    one ONE;
    f(ONE);
    return;
}

1>d:\cplusstu\offer\test.cpp(60) : error C2664: ‘f’ : cannot convert parameter 1 from ‘one’ to ‘two’
1>        No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called

运算符转换

  通过关键字operator后跟随想要转换的类型的方式,将当前类型转换为希望的类型,这种形式的运算符重载是独特的,因为没有指定一个返回类型。

// 测试构造函数的自动类型转换
class two
{
public:
    two(){}
    //explicit two(const one&){}
};

class one
{
public:
    one() {}
    operator two(){return two();}
};

void f(two){}

void main()
{
    one ONE;
    f(ONE);
    return;
}

class string就是很好的自动转换的例子。在使用自动类型转换的过程中特别需要注意隐藏的缺陷和问题。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/120172.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 【Unity小游戏】整整一个周末写一款《皇室战争 玩法》 的 即时战斗类 游戏Demo。两万多字游戏制作过程+解析

    【Unity小游戏】整整一个周末写一款《皇室战争 玩法》 的 即时战斗类 游戏Demo。两万多字游戏制作过程+解析Unity游戏制作,本篇文章介绍了复刻皇室战争玩法的一个自制小游戏,共有该游戏的两万字教程加制作过程,欢迎品尝!世界上没有绝对的公平,如果我们起点就比别人第一步,那就更需要比别人努力了。

    2022年4月29日
    84
  • phpstorm激活码2022【中文破解版】

    (phpstorm激活码2022)这是一篇idea技术相关文章,由全栈君为大家提供,主要知识点是关于2021JetBrains全家桶永久激活码的内容https://javaforall.net/100143.htmlIntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,上面是详细链接哦~747EFQ8BIF-eyJsaWNlb…

    2022年3月31日
    68
  • case when oracle mysql_Mysql oracle casewhen 完美应用

    case when oracle mysql_Mysql oracle casewhen 完美应用使用SQL99标准通用语法中的case表达式,将职位是分析员的,工资+1000;职位是经理的,工资+800;职位是其它的,工资+4001;case字段when条件1then表达式1when条件2then表达式2else表达式nendselectename”姓名”,job”职位”,sal”涨前工资”,casejobwhen‘ANALYST‘thensal+1000wh…

    2022年9月6日
    3
  • FLAG_ACTIVITY_NEW_TASK使用场景及原理简析

    FLAG_ACTIVITY_NEW_TASK使用场景及原理简析在非Activity(比如Service,BroadcastReceiver)中startActivity需要添加flagIntent.FLAG_ACTIVITY_NEW_TASK。否则会报Crash:android.util.AndroidRuntimeException:CallingstartActivity()fromoutsideofanActivitycontext…

    2022年10月6日
    0
  • 自定义手机壁纸_ios怎么自定义动态壁纸

    自定义手机壁纸_ios怎么自定义动态壁纸拥有Android智能手机的主要好处之一就是自定义。有了足够的专业知识,您可以对它的几乎所有方面进行自定义9。值得扎根的Android惊人的定制9值得扎根的Android惊人的定制让您的设备扎根了吗?看完所有这些很棒的仅根定制之后,您可能会改变主意。阅读更多内容,但首先应该开始,是否打算建立根目录。什么是自定义ROM?了解AndroidLingo根源是什么?什么是自定义ROM?学习Android…

    2022年10月22日
    0
  • 海思AI芯片(Hi3516DV300/CV500)开发(1.资料介绍)「建议收藏」

    海思AI芯片(Hi3516DV300/CV500)开发(1.资料介绍)「建议收藏」目录1、SVP资料介绍1.1SVP简介1.2开发框架1.3开发流程2、Hi3516DV300/CV500SDK内容介绍1、SVP资料介绍1.1SVP简介SVP(SmartVisionPlatform)是海思媒体处理芯片智能视觉异构加速平台。该平台包含了CPU、DSP、NNIE(NeuralNetworkInferenceEngine)等多个…

    2022年9月23日
    0

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号