C++之运算符重载

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

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

C++之运算符重载此处内容已经被作者隐藏,请输入验证码查看内容
验证码:
请关注本站微信公众号,回复“”,获取验证码。在微信里搜索“”或者“”或者微信扫描右侧二维码都可以关注本站微信公众号。

  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就是很好的自动转换的例子。在使用自动类型转换的过程中特别需要注意隐藏的缺陷和问题。

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • Android ListView那些事

    Android ListView那些事ListView是我们在开发Android程序时用得比较多的一种widget,通常用来展示多条数据,这里,我对ListView的一些功能点作一个简单介绍。1. Cachecolorhint默认情况下,Android中的View的背景都是透明的,这是一个合理的设计,但是,当渲染到屏幕上时,这会引入许多的计算,因为所有的child的背景是透明的,这就意味着当ListView绘制它的chil

  • 实现带查询功能的Combox控件

    实现带查询功能的Combox控件

    2021年11月30日
  • PHP面向对象

    PHP面向对象

  • UpdatePanel用法详解

    UpdatePanel用法详解本文转自:http://www.cnblogs.com/shangxia/articles/2281782.html今天用做日历显示本月的考勤记录,用到了UpdatePanel控件,才发现对这个控件并不太了解,所以找了点儿资料,整理了一下给大家发上来!一、UpdatePanel的结构”ScriptManager1″runat=”server”>”Update

  • 小米8手机相册中的图片怎么识别文字?[通俗易懂]

    小米8手机相册中的图片怎么识别文字?[通俗易懂]小米8大家都买了吗?最近新出的还是很好的,小米8手机相册中的图片怎么识别?对于用小米手机的人来说很简单,下面分享一个方法。1在手机上输入PDF阅读器,然后开始识别相册图片的文字2打开就是这样的界面,找到倒数第2个的小功能3选择拍照识别中的相册,接下来添加图片4这张是…

  • 最受欢迎的 Linux 怎么是它,Ubuntu 排第六

    最受欢迎的 Linux 怎么是它,Ubuntu 排第六????作者:Linux猿????简介:CSDN博客专家????,C/C++、面试、刷题、算法尽管咨询我,关注我,有问题私聊!????关注专栏:Linux(优质好文持续更新中……)????不多废话,先来看一下排名:图1DistroWatch网站排名上面是排名前30位的最受欢迎的Linux操作系统,可以看到,比较熟悉的操作系统也名列前茅,比如:Ubuntu、Debian、Fedora、Arch、CentOS、UbuntuKylin以及deepin等。上面的排名是

发表回复

您的电子邮箱地址不会被公开。

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