运算符有很多,比如: + - * / << >> += -= []
++ -- = ()
编写代码时要依次确定以下问题:
- 是作为类的成员函数还是作为友元函数?一般单目运算符用成员函数,双目运算符用友元函数,我认为友元函数更清晰明了.
- 返回值类型是什么?有的是对象,有的是对象的引用,有的是基本数据类型,还有插入析取运算符固定的返回
ostream istream
类对象。要注意返回对象时是系统调用一些构造函数,拷贝了一份该对象的副本,缺点在于浪费时间空间,一般返回对象的引用。但是如果要返回的是局部对象(临时对象),就必须返回对象本身,因为它会在函数结束时被销毁,引用就变成野指针了. - 形参是什么形式?一般用对象的引用,避免调用拷贝构造函数。根据情况使用
const
限定符.
值得一提的几个实例:
一、析取运算符,插入运算符
//实现复数类的输出读入
friend ostream &operator<<(ostream &os, Complex &a)
{
os<<a.r<<"+"<<a.i<<"i"<<endl;
return os;
}
friend istream &operator>>(istream &is, Complex &a)
{
is>>a.r>>a.i;
return is;
}
二、下标运算符
//多用于数组对象
class Array
{
private:
int *a;
int size;
public:
Array(int *b,int n);
~Array(){
delete []a;}
int & operator[](int i){
return a[i];}
};
Array::Array(int *b,int n)
{
a = new int[n];
for(int i = 0;i<n;i++)
a[i] = b[i];
size = n;
}
int main()
{
int b[10]={
1};
Array arr(b,10);
for(int i = 0;i<10;i++)
cout<<arr[i]<<endl;
arr[9] = 100;
cout<<arr[9]<<endl;
}
三、自加自减运算符
这里要注意是后置还是前置,后置要有一个int形参(C++的规定);后置是要改变对象后还能返回原值,所以只能新建一个局部对象,并且返回对象本身,千万不能返回引用
例题:
时间类的流插入、提取和递增、递减运算
封装一个时间类Time,在类上重载以下运算符,使得main()函数能够正确运行。
流插入操作符“>>”,按照输入格式从标准输入读取三个整数:hh,mm,ss,分别表示时、分、秒,其值在int范围内。
流提取操作符“