运算符重载

来源:互联网 发布:热血江湖sf源码 编辑:程序博客网 时间:2024/06/05 00:09

运算符重载
2016 6 21
this:每个对象默认有一个指针,指针指向了对象本身
a.print();
作用:1.成员变量和形参同名:this->x=x;
2.函数链 a.setx(10).sety(20).setRadius(30);

**static: c静态,c++(静态成员变量、静态成员函数)
c++中静态成员不属于 某个对象,内存中只有一份内存地址,属于整个类**

静态成员变量初始化:普通函数形式
int Circle::num=10;

**静态成员函数:静态函数只能调用、访问静态成员(变量。函数)
调用:Circle::静态成员函数名称**

friend:友元函数 友元类
可以直接访问私有成员

今天的内容
操作符重载:操作符操作自定义类型操作数(使用量不大)
**注意:
1.只能重载已经存在的操作符(+ - * /)
2、重载后操作数 数量不变(4+5)
3、至少有一个操作数是用户自定义类型 //int+ int error
4.重载后优先级不变**

operator:要重载的操作符是……
操作符重载两种形式:friend、 成员函数

如果函数实现在声明中完成,这个函数是一个内联函数(不要写过于复杂的语句 eg:if,代码不要过长,函数实现快,但增加内存使用

#include <iostream>using namespace std;class Point{public:    //重载+/-    friend Point operator+(const Point& p1,const Point& p2);//友元函数形式操作符重载    Point operator-(const Point& p1);//成员函数形式操作符重载    Point operator*(const Point& p1);    Point operator/(const Point& p1);    //如果函数实现在声明中完成,这个函数是一个内联函数(不要写过于复杂的语句 eg:if,代码不要过长,快,增加内存使用    Point(float _x,float _y){        x=_x;        y=_y;    }    void print();private:    float x;    float y;};inline void Point::print(){    cout<<x<<endl;    cout<<y<<endl;}Point operator+(const Point& p1,const Point& p2){    int x=p1.x+p2.x;    int y=p1.y+p2.y;    return Point(x, y);}//当一个对象作为成员函数的参数传递,在函数内是可以访问其私有成员的Point Point:: operator-(const Point& p1){    int x=p1.x-this->x;    int y=p1.y-this->y;    return Point(x, y);}Point Point:: operator*(const Point& p1){    int x=p1.x*this->x;    int y=p1.y*this->y;    return Point(x, y);}Point Point:: operator/(const Point& p1){    if(this->x==0||this->y==0){        exit(1);//程序异常退出    }    int x=p1.x/this->x;    int y=p1.y/this->y;    return Point(x, y);}int main(int argc, const char * argv[]) {    Point p1(2,4);    Point p2(5,6);    Point p3(0, 0);    (p1+p2).print();    p1.operator-(p2).print();     //对象调用成员函数+     //p1.+(p2)    (p1+p2).print();    (p1-p2).print();    (p3/p2).print();     (p3*p2).print();    return 0;}

[]、<<、>>、==、>、+=重载

#include <iostream>using namespace std;class Point{    /*     ostream&:函数链     ostream& out:直接使用cout(out)?     const Point &p:输出的对象     注意:输出输入运算符重载只能使用friend     第一个传递的是     */    friend ostream& operator<<(ostream& out,const Point &p);    friend istream& operator>>(istream& in, Point &q);    //重载+= </> ==  课后习题  题库 大作业1 总结    friend Point operator+=( const Point& p1,const Point &p2);    friend int operator>( const Point& p1,const Point &p2);    friend int operator==( const Point& p1,const Point &p2);public:    Point(float _x,float _y){        x=_x;        y=_y;    }    float getx();    float gety();    void print();private:    float x;    float y;};//下标操作符重载只能用成员函数形式   (只能是成员函数形式运算符重载)class Text{public:    //const对象进行调用    const int& operator[](int index)const{//[]自定义函数        return array[index];              //[]系统提供下标符    }    //非const对象进行调用    int& operator[](int index){        return array[index];    }    friend ostream& operator<<(ostream& out,const Text &t){        for(int i=0;i<4;i++)            out<<t.array[i]<<endl;        return out;    }private:    int array[20];};float Point:: getx(){    return x;}float Point:: gety(){    return y;}void Point:: print(){    cout<<x<<","<<y<<endl;}class Circle {    friend ostream& operator<<(ostream& out,const Circle &c);public:    Circle(float a,float b,float r);    void print();private:    Point p;    float radius;};Circle::Circle(float a,float b,float r):p(a,b){    radius=r;}void Circle::print(){    cout<<radius<<endl;}ostream& operator<<(ostream& out,const Point &p){    out<<p.x<<endl;//直接调用p类中的输出操作符重载    out<<p.y<<endl;    return out;}/*在point类的基础上写一个Circle类,使用组合,给Circle类添加输出操作符重载*/ostream& operator<<(ostream& out,const Circle &c){    out<<c.p<<endl;    return out;}/*cin:输入操作符重载*/istream& operator>>(istream& in,Point &q){//注意:Point 前不用const否则会出错    in>> q.x;    in>> q.y;    return in;}Point operator+=( const Point& p1,const Point &p2){    float x=p1.x+p2.x;    float y=p1.y+p2.y;    return Point(x, y);}int operator>( const Point& p1,const Point &p2){    int n=0;    if(((p1.x>p2.x)&&(p1.y>p2.y))||((p1.x>p2.x)&&(p1.y==p2.y))||((p1.x==p2.x)&&(p1.y>p2.y)))    {  n= 1;}    else     { n= 0;}    return n;}int operator==( const Point& p1,const Point &p2){    int n;    if((p1.x==p2.x)&&(p1.y==p2.y))        n=1;    else        n=0;    return n;}int main(int argc, const char * argv[]) {    Point p(3, 4);    cout<<p<<endl;    Circle c(1, 2, 3);    cout<<c<<endl;    float a;    cin>>a;    cout<<a<<endl;    Text t;    t[0]=100;    t[1]=300;    t[2]=400;    cout<<t<<endl;    Point p1(10,20);    Point p2(5,6);    (p1+=p2).print();    cout<<(p1>p2)<<endl;    cout<<(p1==p2)<<endl;}
加减乘除运算符重载#include <iostream>using namespace std;class Point{public:    //重载+/-    friend Point operator+(const Point& p1,const Point& p2);//友元函数形式操作符重载    Point operator-(const Point& p1);//成员函数形式操作符重载    Point operator*(const Point& p1);    Point operator/(const Point& p1);    //如果函数实现在声明中完成,这个函数是一个内联函数(不要写过于复杂的语句 eg:if,代码不要过长,快,增加内存使用    Point(float _x,float _y){        x=_x;        y=_y;    }    void print();private:    float x;    float y;};inline void Point::print(){    cout<<x<<endl;    cout<<y<<endl;}Point operator+(const Point& p1,const Point& p2){    int x=p1.x+p2.x;    int y=p1.y+p2.y;    return Point(x, y);}//当一个对象作为成员函数的参数传递,在函数内是可以访问其私有成员的Point Point:: operator-(const Point& p1){    int x=p1.x-this->x;    int y=p1.y-this->y;    return Point(x, y);}Point Point:: operator*(const Point& p1){    int x=p1.x*this->x;    int y=p1.y*this->y;    return Point(x, y);}Point Point:: operator/(const Point& p1){    if(this->x==0||this->y==0){        exit(1);//程序异常退出    }    int x=p1.x/this->x;    int y=p1.y/this->y;    return Point(x, y);}int main(int argc, const char * argv[]) {    Point p1(2,4);    Point p2(5,6);    Point p3(0, 0);    (p1+p2).print();    p1.operator-(p2).print();    //对象调用成员函数+    //p1.+(p2)    (p1-p2).print();    (p3/p2).print();    return 0;}
0 0
原创粉丝点击