博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C++的运算符重载及其限制
阅读量:4111 次
发布时间:2019-05-25

本文共 1548 字,大约阅读时间需要 5 分钟。

                             C++的运算符重载及其限制

 

C++的运算符重载是C++多态的一种表现形式之一,也被称之为运算符函数重载(这是因为C++中可重载的运算符确实有函数名表示法和运算符表示法两种表示方法)。

Test operator+(const Test& t)const{       m_data_int+= t.m_data_int;       return *this;}// 使用示例Test t1{99};Test t2{11};Test t3= t1 + t2;Test t4;t4= t1.operator+(t1 + t3);

C++中可重载的运算符重载为数众多,也存在着一些限制,这些限制包括:

       1、为防止用户为标准类型重载运算符,重载后的运算符必须至少有一个是用户自               定义类型的数据。

       2、不能违反运算符原有的运算规则。

       3、不能重载不存在的运算符,即不能创建新的运算符

       4、以下运算符不可重载:

              sizeof :sizeof运算符

              . :成员运算符

              .* :成员指针运算符

              :: : 域解析运算符

              ? : 条件运算符

              typid : RTTI运算符

              const_cast、dynamic_cast、reinterpret_cast、static_cast  :强制类型转换

       5、只能用作成员函数重载的运算符:

              = :赋值运算符

              () :函数调用运算符

              [] :下标(索引)运算符

              -> :通过指针访问类成员的运算符

       6、可重载运算符列表

 +

 -

 *

 /

 %

 ^

 &

 |

 ~=

 !

 =

 <

 >

 +=

 -+

 *=

 /=

 %=

 ^=

 &=

 |=

 <<

 >>

 >>=

 <<=

 ==

 !=

 <=

 >=

 &&

 ||

 ++

 --

 ,

 ->*

 ->

 ()

 []

 new

 delete

 new[]

delete[] 

 

C++中的运算符也可以进行友元重载(运算符重载和运算符函数重载是同意的)。再次举例,如下:

//友元重载的声明friend std::ostream& operator<<(std::ostream& os, const Test& t);//友元重载的定义void operator<<(std::ostream& os, const Test& t){       os<< "当前数据:"<< t.m_data_int<< endl;}

C++的运算符重载可以作为成员函数重载,也可以作为非成员函数(友元)重载,两者之间最重要的区别在于重载函数的参数列表的不同,作为成员函数重载的时候会隐式的传递this指针,而作为非成员函数进行重载的时候需要显式传递。

C++中++、--运算符的重载式很特别的存在,它们有独特的格式,分为前自增(自减)和后自增(自减)。为了编译器能够进行区分,引入了一个额外的int进行区分,但这个int不含有实际意义:

Test& Test::operator++()// 前自增{       ++m_data_int;       return *this;}Test Test::operator++()// 后自增,后自增实现一般返回对象,而不是引用{       Test temp= *this;       m_data_int++;       return temp;}

C++中的转换函数通常很有作用,例如用户封装了一个自己的字符串类型的类(不是库函数中的string类),内部实现使用的是C风格的字符串,那么怎么才能让这个类能够对外提供C风格字符串的操作呢?或许提供一个这样的类型重载(类型转换)是一个很好的选择:

operator char*()const;

 

转载地址:http://pqmsi.baihongyu.com/

你可能感兴趣的文章
TCP/IP协议三次握手与四次握手流程解析
查看>>
PHP 扩展开发 : 编写一个hello world !
查看>>
inet_ntoa、 inet_aton、inet_addr
查看>>
用模板写单链表
查看>>
链表各类操作详解
查看>>
C++实现 简单 单链表
查看>>
Linux的SOCKET编程 简单演示
查看>>
Linux并发服务器编程之多线程并发服务器
查看>>
C语言内存检测
查看>>
Linux epoll模型
查看>>
Linux系统编程——线程池
查看>>
Linux C++线程池实例
查看>>
shared_ptr的一些尴尬
查看>>
C++总结8——shared_ptr和weak_ptr智能指针
查看>>
c++写时拷贝1
查看>>
Linux网络编程---I/O复用模型之poll
查看>>
Java NIO详解
查看>>
在JS中 onclick="save();return false;"return false是
查看>>
idea 有时提示找不到类或者符号
查看>>
matplotlib.pyplot.plot()参数详解
查看>>