C++只能在类内实现的运算符重载

开门见山:在C++种只能在类内实现的运算符重载的只有四个,赋值运算符=  函数调用运算符()  下标运算符[]  指针访问类成员的运算符->

 

第一种:赋值运算符=的重载

首先我们需要知道的是,一个类如果什么都没有,系统会为这个类默认提供四种东西

1.无参构造函数(无参且函数体是空的)
2.析构函数(无参,且函数体是空的)
3.默认拷贝构造函数,对属性进行值拷贝
4.赋值运算符的重载 operator=, 对属性进行值拷贝(也就是说,在我们实际重载之前,编译器以及写过一个值拷贝的构造函数了)

通常我们都知道前三个,那么第四个就可以解释为什么赋值运算符只能在类内进行重载了,因为如果是普通变量的普通类,那么系统提供的默认赋值函数是足够的,但是如果涉及指针的变量,就需要我们自定义赋值函数了(避免同一个指针地址同时作为两个类对象的成员数据,当其中一个被析构时,另一个对象报错的现象)

//赋值运算符重载
class Student
{
public:
    Student(string a,int b):name(a),id(b)
    {}
    void Getname()
    {
        cout << this->name << endl;
    }
    void Getid()
    {
        cout << this->id << endl;
    }

    Student& operator=(Student& s)
    {
        name = "default";
        id = 000;
        return *this;
    }
private:
    string name;
    int id;

};

int main()
{
    Student s1("a", 1);
    Student s2("b", 2);
    s2 = s1;
    s2.Getid();
    s2.Getname();
    return 0;
}

类外重载直接报错:

 

 

第二种:下标运算符[]

下标运算符[]之所以要用类内进行重载的原因在于,[]必须要用一个对象,比如a[i],b[j]等等,针对对象的取下标操作,如果是全局的话,[3]就显的毫无意义

//下标运算符[]重载
class Student
{
public:
    Student(string a,int b):name(a),id(b)
    {}
    void Getname()
    {
        cout << this->name << endl;
    }
    void Getid()
    {
        cout << this->id << endl;
    }

    Student operator[](int x)
    {
        Student sub("default",000);
        return sub;
    }
private:
    string name;
    int id;

};

int main()
{
    Student s1("a", 1);
    Student s2("b", 2);
    s1 = s2[1];
    s1.Getid();
    s1.Getname();
    return 0;
}

 

第三种:函数调用运算符()

//函数调用运算符()重载
class Student
{
public:
    Student(string a,int b):name(a),id(b)
    {}
    void Getname()
    {
        cout << this->name << endl;
    }
    void Getid()
    {
        cout << this->id << endl;
    }

    Student operator()(string a, int b,int c)
    {
        name = a;
        id = b + c;
        return *this;
    }
private:
    string name;
    int id;

};

int main()
{
    Student s1("a", 1);
    Student s2("b", 2);
    s2 = s1("b", 1, 2);
    s2.Getid();
    s2.Getname();
    return 0;
}

 

第四种:指针访问类成员运算符

由于是用于指针访问类成员,因此->的重载必须是在类内完成的,不能够使用全局的重载

posted @ 2022-02-26 17:02  小康规划  阅读(1146)  评论(0)    收藏  举报