1. 程式人生 > >c++運算子過載1

c++運算子過載1

1、c++絕大多數運算子允許過載,不能過載的運算子只有幾個:
. 成員訪問運算子
. * 成員指標訪問運算子
:: 作用域運算子
Sizeof 長度運算子
?: 條件運算子
2、c++不允許使用者自己定義新的運算子,只能對已有運算子過載
3、**不是C++運算子,但某些程式語言將其作為指數運算子
4、過載不能改變運算子的操作物件個數,如+是雙目運算子,需要兩個引數
5、過載不能改變運算子原有的優先順序
6、過載不能改變運算子原有的結合特性
7、運算子過載函式的引數至少應有一個是類物件獲物件的引用
如int operator(int x,int y)為錯誤的,引數不能全是c++標準型別

#include<iostream>
using namespace std;
class complex
{
    public:
        double real;
        double imag;
        complex(double r=0,double i=0)
        {
            real=r;
            imag=i;
        }
};
complex operator+(complex co1,complex co2)//定義運算子+的過載 
{
    complex temp;
    temp.real=co1.real+co2.real;
    temp.imag=co1.imag+co2.imag;
    return
temp; } int main() { complex com1(1.1,2.2),com2(2.2,3.4),total1,total2; total1=operator+(com1,com2); total2=com1+com2; cout<<"total1:"<<"total1.real:"<<total1.real<<",total1.imag:"<<total1.imag<<endl; cout<<"total2:"<<"total2.real:"
<<total2.real<<",total2.imag:"<<total2.imag<<endl; return 0; }

類的資料成員過載運算子常以以下兩種方式:成員運算子過載函式和友元運算子過載函式
友元運算子過載
在類的內部定義友元運算子格式:
friend 函式型別 operator 運算子(形參表)
{
函式體
}

友元函式在類裡宣告,類外定義:
類中:
class x
{

friend 函式型別 operator 運算子(形參表)

}
類外:
函式型別 operator 運算子(形參表)
{
函式體
}

#include<iostream>
using namespace std;
class complex

{
    public:
        complex(double r=0,double i=0)
        {
            real=r;
            imag=i;
        }
        void print();
        friend complex operator+(complex &a,complex &b);
        friend complex operator-(complex &a,complex &b);
        private:
            double real,imag;
};

void complex::print()
{
    cout<<real;
    if(imag>0)
    {
        cout<<"+";
    }
    if(imag!=0)
    {
        cout<<imag<<"i"<<endl;
    }
}
complex operator+(complex &a,complex &b)
{
    complex temp;
    temp.real=a.real+b.real;
    temp.imag=a.imag+b.imag;
    return temp;
}

complex operator-(complex &a,complex &b)
{
    complex temp;
    temp.real=a.real-b.real;
    temp.imag=a.imag-b.imag;
    return temp;
}

int main()
{
    complex A1(2.3,4.6),A2(3.6,5.6),A3,A4;
    A3=A1+A2;
    A4=A1-A2;
    A1.print();
    A2.print();
    A3.print();
    A4.print();
    return 0;
}

友元運算子過載單目運算子

#include<iostream>
using namespace std;
class coord
{
    public:
        coord(int i=0,int j=0)
        {
            x=i;
            y=j;
        }
        void print()
        {
            cout<<"x:"<<x<<",y:"<<y<<endl;
        }
        friend coord operator--(coord &obj)
        {
            --obj.x;
            --obj.y;
            return obj;
        }
        private :
            int x,y;
};
int main()
{
    coord obj(12,34);
    obj.print();
    --obj;
    obj.print();
    operator--(obj);
    obj.print();
    return 0;
}

注意,friend coord operator–(coord &obj),形參是物件的引用,是通過傳址的方式傳遞引數的,函式形參的變化引起實參的變化,若去掉&符號,則函式體內對形參的修改無法傳到函式體外
有的運算子不能定義為友元運算子過載,如賦值運算子“=”,下標運算子“[]”,函式呼叫運算子“()”等

成員運算子過載函式
雙目運算子過載:成員運算子過載函式的形參表僅有一個引數,他作為運算子的右運算元,另一個運算元(左運算元)是隱含的,是該類當前的物件,它是通過this指標隱含傳遞給函式的

#include<iostream>
using namespace std;
class complex
{
    public:
        complex(double r=0,double i=0);
        void print();
        complex operator+(complex c);
        complex operator-(complex c);
        private:
            double real,imag;
};
complex::complex(double r,double i)
{
    real=i;
    imag=i;
}

void complex::print()
{
    cout<<real;
    if(imag>0)
    {
        cout<<"+";
    }
    if(imag!=0)
    {
        cout<<imag<<"i"<<endl;
    }
}
complex complex::operator+(complex c)
{
    complex temp;
    temp.real=real+c.real;
    temp.imag=imag+c.imag;
    return temp;
}

complex complex::operator-(complex c)
{
    complex temp;
    temp.real=real-c.real;
    temp.imag=imag-c.imag;
    return temp;
}

int main()
{
    complex A(2.3,4.5),B(3.5,6.7),C,D;
    C=A+B;
    D=A-B;
    A.print();
    B.print();
    C.print();
    D.print();
    return 0;
}

*單目運算子過載:*成員運算子過載函式的引數列表中沒有引數,此時當前物件作為運算子的一個運算元

include

using namespace std;
class coord
{
public:
coord(int i=0,int j=0);
void print();
coord operator++();
private:
int x,y;
};
coord::coord(int i,int j)
{
x=i;
y=j;
}
void coord::print()
{
cout<<”x:”<