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; }
第四种:指针访问类成员运算符
由于是用于指针访问类成员,因此->的重载必须是在类内完成的,不能够使用全局的重载