C++(5):运算符重载
来源:互联网 发布:天津建经软件 编辑:程序博客网 时间:2024/04/29 07:06
引言
函数重载,function overloading。
同名异式,即重载。
虽然函数名相同,但也许是输入参数类型不同,个数不同,等等……
这就是重载。
运算符,operator,似乎也可以归为函数。c++里面, 有些运算符已经被重载过了。只是,我太无知,不懂而已……
就像减号(-)。
3-1,是算术的减号,
-1,是负数的符号,
……
下面,总结一些重要的、常见的运算符的重载。
运算符重载,一般有作为成员函数重载和作为友元函数重载这两种。
先定义一个自己的复数类。 complex number。头文件里基本是这样。
class CComplex{public:CComplex();CComplex(double real,double imag);private: double real; double imag;}
现在要重载 == 号,判断两个复数是否相等。
作为成员函数重载
overloading as a member function.
写在class里面,public修饰符后面。这是头文件中的内容。
class CComplex{public:CComplex();CComplex(double real,double imag); bool operator==(const CComplex & c1);}外面的实现,就是
bool CComplex :: operator==(const CComplex & x) { return ((this->real == x.real) && (this->imag== x.imag));}例子虽小,但有2点值得注意。
1. 竟然可以通过 “.” 一点,把x的私有real点出来。为什么?因为此时的==号是CComplex这个class的成员函数!
CComplex这个类的成员函数,是可以访问CComplex对象的任何成员的!
2. 比较两个复数是否相等,本来是两个数在比,为什么这个函数的输入参数竟然只有一个?
因为已经把==号作为member function去重载了。比较obj1和obj2的时候,相当于是通过 obj1 ,去调用obj1的==成员函数,
所以此时只需要再给另一个输入参数 obj2 就好了。
作为友元函数重载
overloading as a friend function.
声明在类内部,前面用friend加以修饰,然后是函数。
注意,friend function不是member function!!!!头文件里,声明的时候这么写。
friend bool operator==(const CComplex & , const CComplex &);在外面实现的时候,这么写。
bool operator==(const CComplex & o1, const CComplex & o2){return ((o1.real==o2.real)&&(o1.imag==o2.imag));}
注意,千万不能写(CComplex :: xxx)。本来就不是成员函数,根本不属于CComplex这个类。
因为,这不是成员函数,所以,比较两个复数是否相等,需要提供两个输入参数,即上面的o1 和 o2 。
其他一些运算符的重载
++、-- 运算符
++、--运算符的重载,写法及注意事项,请参考前文。
注意,前置++是支持连续++的,但是后置++不支持连续++的。至于原因,
请直接review:++i,i++,++++i,i++++
<<、>> 运算符
以前写JAVA的时候,有个很方便的工具叫MyEclipse,有个功能refactor,可以自动生成一个 toString() 的函数。
现在在C++里面,希望也能直接通过 << 把某个对象 obj 的成员属性都打出来。于是,需要重载 << 号。对 >> 的需求也类似。
因为有语法规定,<< 或 >> 不能作为member function去overloading。所以,一般会把 << 或 >> 作为friend function去overloading。
因为,有一种用法是
cout<<"Hello"<<" "<<"world!"<<endl;<<是支持连续<<的,>>也类似。所以,在overload <<或>>的时候,类型为ostream或istream的对象s,
需要一直是引用!而不是拷贝!返回也需要返回引用!而不是拷贝!是reference,不是copy,不是assign!
重载 <<
在类里面声明的时候,写为
friend ostream & operator<<(ostream &os, const CComplex & c1);在类外面实现的时候,写为
ostream & operator<<(ostream &os, const CComplex & c1) {os<<"( "<<c1.real<<", i"<<c1.imag<<")";return os;}从此以后,就可以写
CComplex c1(0,0), c2(0,1);cout<<"c1="<<c1<<","<<"c2="<<c2<<endl;了。
重载 >>
在类里面声明的时候,写为
在类里面声明的时候,写为
friend istream & operator>>(istream & is, CComplex & o);在类外面实现的时候,写为
isteram & operator>>(istream & is, CComplex o) { is>>o.real>>o.imag; return is;}
[ ] 下标运算符的重载
[ ] 的重载,据说一般是用来检查是否越界。
两点注意。
1. 只能作为 member function 重载;
2. 只能返回对象本身(即ref)。
0 0
- C++(5):运算符重载
- 运算符重载(c++)
- 重载赋值运算符(c/c++)
- C++-运算符重载
- [C++]重载运算符
- C#:运算符重载
- c++-++运算符重载
- C++:重载运算符
- 运算符重载(C++)
- [c++]运算符重载
- 【C++】运算符重载
- C++--------------------------------------------运算符重载
- C#:运算符重载
- C++:运算符重载
- C++:运算符重载
- C#:运算符重载
- [C++]运算符重载
- 【c++】运算符重载
- 重写向&转发
- 初识指针
- 浅谈Java内存管理(二)
- Java的静态/动态绑定
- 位图索引
- C++(5):运算符重载
- 基于jsp的bbs论坛-(3)java中对model的实现
- python中文字符串的编码问题
- 基于jsp的bbs论坛-(4)java中对dao的实现
- 基于jsp的bbs论坛-(5)java中对test的实现
- 基于jsp的bbs论坛-(6)java中对servlet的实现
- Linux 网络相关的命令
- POJ上题目分类
- 基于jsp的bbs论坛-(6)java中对servlet的实现