c++的自定义类型的运算

一:首先说明下成员函数和非成员函数的区分
class A
{
public:
    void f1(){}; // 这个就是成员函数。
    void f2(); // 这个也是成员函数声明,其实现在类的外部。
};
void A::f2(){} // 这个是成员函数的实现。
void f3(){}; // 这个就是非成员函数,它不属于A,也不属于任何一起其他的类。
*加上下面二中的运算符重载为非成员函数和成员函数
二.运算符重载函数
1.五个运算符不允许重载
(1).成员访问运算符
(2).*成员指针运算符
(3)::作用域区分运算符
(4)?:条件运算符
(5)sizeof 测数据空间大小运算符
2.在可重载的运算符中除了new和delete以外,任何运算符都可以重载为成员函数,但不得重载为静态函数。
(附):静态函数参见另一篇文章
(正式进入主题)
二.运算符重载
1.运算符重载为非成员函数和成员函数对比(重载+ - * /)
#include<iostream>
using namespace std;
class Complex
{
protected:
    double real,image;
public:
    Complex(double r=0,double i=0){real=r;image=i;}
    friend Complex operator-(Complex c1,Complex c2);//非成员函数,用friend作用是友元函数可以用类中的任何数据
    Complex operator+(Complex c1);//成员函数
    void show(){cout<<real<<"+"<<image<<"i"<<endl;}
};
Complex  Complex::operator+(Complex c1)//成员函数实现
{
    return Complex(real+c1.real,image+c1.image);
}
Complex operator-(Complex c1,Complex c2)//非成员函数实现
{
    return Complex(c1.real-c2.real,c1.image-c2.image);
}
int main()
{
    Complex c3,c1(3,4),c2(1,2);
    c3=c1-c2;//即c3=operator-(c1,c2),顺便说一下如果两边都是Complex类型赋值运算符不用重载
    c3.show();
    c3=c1+c2;//即c3=c1.operator+(c2)
    c3.show();
    return 0;
}
运行结果:
2+2i
4+6i

2.重载++ --
Complex operator ++();//前置加1运算符
Complex operator ++(int)//后置加1运算符函数
(举个栗子):
Complex& Complex::operator++()//顺便讲一下这里的引用是为了在return *this时少调用一次复制构造函数,以及可以出现在等号左边如:++c1=...
{
 ++real;
 return *this;//返回值已变
}
Complex Complex::operator(int)
{
 return Complex(real++,image);//返回值不变
}
3.重载 =
注意点:
 赋值运算符只能作为成员函数重载(重点);
举个例子:FunType& operator = (FunType&,FunType);//错误!因为只能作为成员函数重载
 要求第一操作数必须是左值,即加引用;
 重载 = 一般与深拷贝浅拷贝挂钩,所以建议读者去看作者另一篇文章是c++深拷贝与浅拷贝
4.重载类型转换符,即强制类型转换
一般用法(省略了一些代码,只讲关于运算符的代码):
class
{
private:
    double:real,image;
public:
    operator lue();//类型转换运算符函数
};
Complex::operator lue()
{
return real;//只返回了实数

int main()
{
  Complex a(1,2);
  lue(a); 
}
特殊用法:在重载=运算符时,当运算符两边数据类型不同时,会自动进行类型转换,如果右边是对象,在类中要找强制类型转换符
 如 t=c[j];(wustacm平台的1457题)
在类中要加上operator double(){return radius;}

5.重载下标访问运算符 []
注意点:
 返回必须引用,因为赋值运算符会出现在=左边。
代码:
class
{
private:
 double *data;
public:
 double& operator[](int index);//声明时注意引用
};
double& Array::operator[](int index)
{
 if(...)
   return data[...];
6.重载>>和<<运算符
class Circle
{
private:
     radius;  
public:
     friend istream& operator>>(istream&i,Circle &m);//非成员函数
     friend ostream& operator<<(ostream&o,Circle &m);    
};
istream& operator>>(istream&i,Circle &m)
{
 cin>>m.radius;
 return i;
}
ostream& operator<<(ostream&o,Circle m)
{
 cout<<m.radius;
 return o;//是o不是0
}
7.重载*运算符
#include<iostream>
using namespace std;
class A
{
private:
    int *data;
public:
    A(int n)
    {
        data=new int[n];
    }
    operator int*()//相当于强制类型转化,加int是为了与乘号区分开
    {
        return data;
    }
};
int main()
{
    A a(5);
    for(int i=0;i<5;i++)
        *(a+i)=i+1;
    for(int i=0;i<5;i++)
        cout<<*(a+i);
    return 0;
}




















猜你喜欢

转载自blog.csdn.net/qq873044564/article/details/80400473