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


相关推荐

  • hdu 2058_HAL248

    hdu 2058_HAL248ThesumproblemTimeLimit:5000/1000MS(Java/Others)  MemoryLimit:32768/32768K(Java/Others)TotalSubmission(s):24299  AcceptedSubmission(s):7247ProblemDescriptionGivenas

    2022年10月2日
    2
  • AspNetPager组件

    AspNetPager组件UrlPaging=”false”NumericButtonTextFormatString=”[{0}]”CustomInfoHTML=”第%CurrentPageIndex%页共%PageCount%页显示%StartRecordIndex%-%EndRecordIndex%条”                                   ShowCusto

    2025年7月31日
    6
  • PhpStorm中报 “Cannot run program git.exe, 系统找不到指定的文件” 

    PhpStorm中报 “Cannot run program git.exe, 系统找不到指定的文件” 

    2021年10月10日
    45
  • 一个封装的BeanCopier工具类[通俗易懂]

    一个封装的BeanCopier工具类[通俗易懂]工具类BeanCopierUtils1.支持source对象到target对象的拷贝2.支持Listsource到Listtarget的拷贝

    2025年9月1日
    7
  • java类的加载机制及加载过程_深入理解计算机pdf

    java类的加载机制及加载过程_深入理解计算机pdf每个开发人员对java.lang.ClassNotFoundExcetpion这个异常肯定都不陌生,这个异常背后涉及到的是Java技术体系中的类加载机制。本文简述了JVM三种预定义类加载器,即启动类加载器、扩展类加载器和系统类加载器,并介绍和分析它们之间的关系和类加载所采用的双亲委派机制,给出并分析了与Java类加载原理相关的若干问题。

    2022年8月11日
    7
  • spidermonkey学习

    spidermonkey学习JavaScript在浏览器中的应用几乎是尽人皆知的。实际上,JavaScript技术也可以使用在非浏览器应用程序当中,从而让应用程序具有自动的脚本功能。本文介绍了一种功能非常强大的JavaScript引擎SpiderMonkey。这个引擎是Mozilla浏览器的JavaScript引擎。该引擎接口定义清晰,模块化好。本文简要介绍了SpiderMonkey的基本结构,并讲解了如何在自己的应用

    2022年10月16日
    2

发表回复

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

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