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