c++学习(二)——重载操作符与转换

原创 2007年10月06日 20:06:00

把学习C++primer的感受写下来,哪怕是照着抄,也要慢慢吃透。发现瞪着两只眼睛看,效果就是眼球发酸,瞌睡,把笔动起来,对学习是有好处的。写的同时,脑子也会跟着思考。不瞌睡。妙法——从效率上讲还是比较快的。

重载操作符与转换

通过操作符重载,能够针对类类型的操作数定义不同的操作符版本。

一、重载操作符的定义 

重载操作符是具有特殊名称的函数:保留字operator后接需定义的操作符符号。重载操作符具有返回类型和形参表,如下语句:

Sales_item operator+(const Sales_item&, const Sales_item&);

除了函数调用操作符之外,重载操作符的形参数目(包括成员函数的隐式this指针)与操作符的操作数数目相同。函数调用操作符可以接受任意数目的操作数。

不能重载的操作符包括“::”,“.*”,“.”,“?:”

还有重载操作符必须具有一个类类型操作数。用于内置类型的操作符,其含义不能改变。例如,内置的整型加号操作符不能重定义。

// error: can not redefine built-in operator for ints

int operator+(int, int);

也不能为内置数据类型重定义加号操作符。

重载操作符必须具有至少一个类类型或枚举类型的操作数。这条规则强制重载操作符不能重新定义用于内置类型对象的操作符的含义。

加强记忆:重载操作符必须具有一个类类型操作数。

操作符的优先级、结合性或操作数数目不能改变,不管操作数的类型和操作符的功能定义如何。

重载操作符并不保证操作数的求值顺序,尤其是,不会保证内置逻辑AND、逻辑OR和逗号操作符的操作数求值。

重载这些&&、||或逗号操作符不是一种好的做法。

大多数重载操作符可以定义为普通非成员函数或类的成员函数。

作为类成员的重载函数,其形参看起来比操作数数目少1。作为成员函数的操作符有一个隐含的this形参,限定为第一个操作数。

重载一元操作符如果作为成员函数就没有显式形参,如果作为非成员函数就有一个形参。类似的,重载二元操作符定义为成员时就有一个形参,定义为非成员函数时,有两个形参。

操作符定义为非成员函数时,通常必须将它们设置为所操作类的友元。

使用重载操作符可以隐式调用也可以显式调用。

调用成员操作符函数与调用其它任意函数一样:指定运行函数的对象,然后使用点或箭头操作符获取希望调用的函数。

重载操作符的设计

1、不要重载具有内置含义的操作符。

重载逗号、取地址、逻辑与、逻辑或等操作符通常不是好做法,这些操作符具有有用的内置含义。如果我们定义了自己的版本,就不能使用这些内置含义了。

2、大多数操作符对类对象没有意义。

设计类的时候,应该确定要支持哪些操作符。

为类设计操作符,最好的方式是先设计类的公用接口。定义了接口之后,就可以考虑应将那些操作符定义为重载操作符。

3、符合赋值操作符

如果一个类有算数操作符或位操作符,那么提供相应的复合赋值操作符一般是一个好的做法。

4、相等和关系操作符

如果类定义了相等操作符,它也应该定义不等操作符。类用户会假设如果可以进行相等比较,则也可以进行不等比较。同样的规则也应用于其它关系操作符。

5、选择成员或非成员实现

为类设计重载操作符的时候,必须选择是将操作符设置为类成员还是普通非成员函数。在某些情况下,程序员没有选择,操作符必须是成员;在另一些情况下,有些经验原则可指导我们做出决定。

一些指导原则:

(1)赋值、下标、调用和成员访问箭头灯操作符必须定义为成员,将这些操作符定义为非成员函数将在编译时标记为错误。

(2)像赋值一样,复合赋值操作符通常应定义为类的成员。

(3)改变对象状态或与给定类型紧密联系的其他一些操作符,通常应定义为类成员。

(4)对称的操作符,如算术操作符、相等操作符、关系操作符和位操作符,最好定义为普通非成员函数。

 

【c/c++】类型转换函数(类型转换运算符重载函数)

用转换构造函数可以将一个指定类型的数据转换为类的对象。但是不能反过来将一个类的对象转换为一个其他类型的数据(例如将一个Complex类对象转换成double类型数据)。 C++提供类型转换函数(ty...
  • lzm18064126848
  • lzm18064126848
  • 2016年01月04日 18:09
  • 2801

对于c++中流操作符重载的理解

对于IO成员函数的重载不应该是一个成员函数的方式,并且应该声明为友元 一、如果为成员函数,都会有一个某人的参数,也就是this指针,为左操作数,下面考虑将其声明为成员函数的方式 对于cout 对于...
  • lightblueme
  • lightblueme
  • 2015年03月28日 13:01
  • 753

C++ 运算符流操作符重载和友元--笔记

/************************************************************************************************ *...
  • JarvisChu
  • JarvisChu
  • 2011年07月23日 20:57
  • 5619

C++ 重载操作符 operator

参数个数的限定     非成员函数:   单目运算符:参数表中只有一个参数;   双目运算符:参数表中只有两个参数       成员函数:   单目运算符:参数表中没有参数; ...
  • fenhong91
  • fenhong91
  • 2017年02月07日 09:55
  • 1031

C++ STL 基础及应用(2) 模板与操作符重载

模板是 C++ 语言中重要的概念。它提供了一种通用的方法来开发重用的代码,即以创建参数化的 C++ 类型。 本章将阐述一些具体的 STL 模板思想,并简单介绍操作符重载与模板的联系。 文中将给出一个简...
  • Raito__
  • Raito__
  • 2016年05月22日 17:13
  • 2671

C++重载[]数组操作符

#include #include using namespace std; class CharPair{ public: CharPair(){ } CharPair(char f...
  • w397090770
  • w397090770
  • 2012年03月18日 14:46
  • 6364

C++面向对象操作符重载:调用操作符和函数对象

1、定义了调用操作符的类,其对象常称为函数对象,即它们是行为类似函数的对象。      可以为类类型的对象重载函数调用操作符。一般为表示操作的类重载调用操作符。函数调用操作符必须声明为成员函数。一个...
  • QQrenzai
  • QQrenzai
  • 2015年11月11日 08:58
  • 1099

所有C++操作符重载的例子

1.[ ]操作符重载 C++语言规定:“[ ]”只能作为类的成员函数进行重载。 “[ ]”是C++中的下标运算符,对于数组或指针来说,下表运算的语义是确定的,不能进行重载。因此,如果看到一个运算...
  • chijianxingfeng
  • chijianxingfeng
  • 2013年04月30日 13:04
  • 2450

C++运算符重载(12) - 重载数组索引操作符[]

本篇主要讨论索引操作符[]的重载。 下面是关于重载[]的一些注意事项: 1) 当需要检测下标是否越界时,重载[]是很有用的。 2) 重载函数必须返回引用,因为类似的表达式“arr[i]”可以被当成一个...
  • shltsh
  • shltsh
  • 2015年05月27日 00:15
  • 1412

C++运算符重载(4) - 不能被重载的操作符

C++,中,下面的操作符是不能被重载的: . (成员访问或点操作符) ?: (三元操作符或条件操作符) :: (范围操作符) .* (指向成员的指针操作符) sizeof (取对象大小操作符) typ...
  • shltsh
  • shltsh
  • 2015年05月26日 09:39
  • 2173
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:c++学习(二)——重载操作符与转换
举报原因:
原因补充:

(最多只允许输入30个字)