1.+号运算符重载
什么时候返回值用对象,什么时候用对象?
答:返回值是函数内部的临时对象时候不返回引用,因为引用只是将该临时对象的别名进行了返回,当函数结束时候,对象自动销毁,所以引用就是也指针。
1.1成员函数重载
//返回Person发生拷贝构造函数,这个时候局部变量p3销毁后,拷贝到的另外一个对象不受影响。
Person operator+(const Person& p) //*this+p
{
Person p3;
p3.age = this->age + p.age;
return p3;
}
调用:
p1.operator(p2);//调用方式1
p1+p2;//调用方式2
1.2.全局函数重载
Person operator+ (const Person& p1, const Person& p2)
{
Person p3;
p3.age = p1.age + p2.age;
return p3;
}
调用:
operator+(p1,p2);//调用方式1
p1+p2;//调用方式2
2.<<运算符重载(不能进行成员函数重载)
2.1<< 左移运算符不能进行成员函数重载 因为重载后会变为p.operator(ostream& cout) <=>p<<cout ,而不是cout<<p;
//左移运算符
//链式编程返回引用
ostream& operator<<(ostream& out, const Person& p)
{
out << p.age;
return out; //返回引用,(别名,链式编程)
}
调用:
cout<<p<<endl;
3.++运算符重载
3.1前++
//前置++
Person& operator++()
{
++this->age; //先++
return *this; //后返回本身(引用)
}
调用:
Person p1 = Person(18,"张雨城");
++p1;
3.2后++
//后置
Person operator++(int)
{
//
Person temp = *this; //创建临时对象
this->age++;
//返回局部对象,这个时候将返回值的类型设置为Person类型,这个时候会发生拷贝构造函数,此临时对象销毁后不会影响到另外一个对象,
//如果返回引用类型(引用的是局部变量,这个时候函数执行完成销毁对象,别名就指向野指针了。)
return temp;
}
调用:
Person p1 = Person(18,"张雨城");
p1++;
4.赋值运算符
//赋值运算符重载
Person& operator=(const Person& p)
{
//如果原来的ptr_name不为空先释放内存
if (ptr_name != NULL)
{
delete ptr_name;
ptr_name = NULL;
}
this->age = p.age;
//开一个新的内存
this->ptr_name = new string(*p.ptr_name);
return *this;
}
调用:
Person p1 = Person(18,"张雨城");
Person p2 = p1;
5.==运算符重载
下面为成员函数重载
// ==运算符重载(成员函数,也可以全局函数重载)
bool operator== (const Person& p)const
{
if (*this->ptr_name == *p.ptr_name && this->age == p.age)
{
return true;
}
return false;
}
6.()运算符重载
下面为成员函数重载()的方式
void operator() (string test)
{
cout << test << endl;
}
调用:
//匿名对象调用仿函数
Person()("测试仿函数");