C++ 操作符重载

#include <iostream>
using namespace std;
#include<vector>
//定义一个类,用于存放数据
class Test
{
    int a;
public:
    Test(int x) :a(x){}

    void print_id()
    {
        cout << a << endl;
    }
    void ttt()
    {
        cout << 111 << endl;
    }
    void sss()
    {
        cout << "ssss"<<endl;
    }
    int GetA()  
    {
        return this->a;
    }

};
//定义一个智能指针类,用于托管Test类的指针
class smartpoint
{
    Test* p;
public:

    smartpoint(Test* x)
    {
        p = new Test(x->GetA()); 
    }
    ~smartpoint()
    {
        if (p != NULL)
        {
            delete p;
            p = NULL;
            cout << "析构了" << endl;
        }
    }

    Test* operator->()  //重载->运算符,并使用->运算符可以调用返回值的成员函数
    {
        return this->p;
    }
    Test& operator*()  //重载* 运算符,并使用*运算符获得成员,并通过解引用来调用返回地址所在的对象中的成员,
    {
        //因为成员是指针类型,重载函数的返回值类型为引用,在获取this指针时要解引用返回对象,而不是返回地址,
        return *this->p;  
    }

};


//重载括号操作符
class Temp_01
{

public:
    int operator ()(int x,int y) 
    {
        return x + y;
    }
};



class AA
{
public:
    AA(){ a = 0; };
    AA(int x) :a(x){}

    AA operator + (const AA& other)  //重载算术操作符 + - * / %同理
    {
        AA temp;
        temp.a = this->a + other.a;
        return temp;
    }
    bool operator ==(const AA& other) //重载关系操作符,> <  <= >=同理
    {
        if (this->a == other.a)
            return true;
        else
            return false;
    }
    operator double()  //重载类型操作符 
    {
        return (double)(this->a);
    }

    AA& operator<<(int num)   //重载输出操作符   
    {
        cout << num << endl;
        return *this;
    }
    AA& operator>>(int& num)   //重载输出操作符 传入变量的地址,并由cin输入并返回
    {
        cin >> num;
        return *this;
    }
private:
    int a;
};


//重载元素操作符
class temp
{
public:
    temp(const char* m_buf)
    {
        buf = new char[strlen(m_buf) + 1];
        strcpy(this->buf, m_buf);
    }
    //重载元素操作符
    char& operator [] (int num) 
    {
        return buf[num];
    }
    ~temp()
    {
        if (buf != NULL)
        {
            delete buf;
            buf = NULL;
        }
    }
private:
    char* buf;
};



int main()
{
    AA a(2);
    AA b(2);
    //算术操作符使用示例
    AA c = a + b;

    //关系重载操作符使用示例,
    if (a == b)
    {
        cout << "相同" << endl;
    }
    else
    {
        cout << "不相同" << endl;
    }
    //类型重载操作符使用示例
    double reslut = (double)c;  //调用类型操作符,并将变量类型转换

    //元素操作符操作示例
    temp temp1("helloworld");
    temp1[0] = 'R';  //调用元素操作符重载,并修改指定位置的元素
    //重载元素操作符
    int num_1;

    //重载输入输出操作符
    c >> num_1;     //调用输入重载操作符
    c << num_1;    //调用输出重载操作符

    //重载括号()运算符
    Temp_01 temp11;
    int s =temp11(1, 4);


    smartpoint sp(new Test(1));
    //使用重载->操作符
    sp->print_id();
    sp->sss();
    sp->ttt();
    //使用重载*操作符
    (*sp).print_id();
    (*sp).sss();
    (*sp).ttt();
    return 0;
}

 

posted @ 2020-04-11 20:10  神迹丶  阅读(308)  评论(0编辑  收藏  举报
网站已运行: