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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • SPEL表达式_什么是EL表达式

    SPEL表达式_什么是EL表达式前言最近在搞项目的自定义流程,主流的流程引擎flowable不能很好的支撑业务需求,再考虑到后期的拓展,部门经理说让自己搞一套。这里玩SpEL表达式是为了解决业务流向判断的[条件表达式]问题仿佛记得java是有自定义表达式的,昨儿翻阅书记目录却没有找到,可能是我记错了吧(如果有知道的朋友请留言)。那就直接用SpEL表达式吧,早上查阅了下网上的资料,下面这篇文章挺全的,遂转载一下(copy过来添加了锚点定位,方便以后查阅)8.1介绍8.2功能概述8.3使用Spring的表达接口表达式

    2022年9月12日
    3
  • biztalk什么意思_aide教程网

    biztalk什么意思_aide教程网BizTalk开发系列(二十六) 使用Web Service

    2022年4月21日
    61
  • datagrip 激活码_在线激活

    (datagrip 激活码)JetBrains旗下有多款编译器工具(如:IntelliJ、WebStorm、PyCharm等)在各编程领域几乎都占据了垄断地位。建立在开源IntelliJ平台之上,过去15年以来,JetBrains一直在不断发展和完善这个平台。这个平台可以针对您的开发工作流进行微调并且能够提供…

    2022年3月28日
    55
  • 对于长沙互联网发展,一个外来两年Java程序员的所见所感所愿

    惟楚有材,于斯为盛本文有感于2019长沙互联网求职招聘大会,内容比较多,但都是我自己的一些所见、所感和所愿。2019年3月的最后一天,参加2019长沙互联网求职招聘大会,看到了很多的招聘企业,也看到了很多来求职的技术朋友们。金三银四,找工作的黄金时间,也是招聘的旺季!从去年开始,网上一直可以看到说互联网的寒冬来了,一些一线城市互联网公司的程序员们纷纷被“优化”,那么对于长沙来说,一个互联网…

    2022年2月28日
    114
  • c语言里怎么设立优先级,细说C语言优先级

    c语言里怎么设立优先级,细说C语言优先级0.为什么要掌握优先级想想这两个问题:a.读别人的代码,遇到优先级问题看不懂,怎么办?b.一堆的括号,美观吗?本想贴一张画来装饰墙壁,却用了一堆纸来固定!有人说代码写多了,自然就会了。这个是很宽泛的说法。看你写的代码的水准,有些东西可能你一直都接触不到,何谈熟练。有些东西一定要梳理,总结。1.优先级1.1优先级图表优先级最高者不是真正意义上的运算符,包括:数组下标,函数调用,结构体成员…

    2022年6月16日
    30
  • KTT条件的理解「建议收藏」

    KTT条件的理解「建议收藏」求解优化问题:对于等式约束条件,使用拉格朗日乘子法求;对于不等式约束条件,使用KTT条件求解;这两种方法求得结果只是必要条件,只有当目标函数是凸函数时,才是充分必要条件。着重讲一下KTT条件求解如下优化问题:minxf(x)s.t.gi(x)≤0(j=1,…,n)minxf(x)s.t.gi(x)≤0(j=1,…,n)min_{x}f(x)\nonumber\\…

    2025年7月31日
    4

发表回复

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

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