#include"iostream"
using namespace std;
class comp
{
public:
friend ostream& operator<<(ostream &out,comp &thi);
friend comp &operator+(comp &a,comp &b);//因为函数的是有属性,外界不能访问到,所以将这个函数声明为有元函数
friend comp &operator--(comp &a);//一元运算符的重载
comp(void);//这个是方便后面的创建对象不用给参数,当然你也可以改第二个构造函数的表示方式
comp(int a,int b){
this->a=a;
this->b=b;
}
~comp(){
cout<<"析构函数调用完毕"<<endl;
}
void printC(){//用来检验是否初始化了a和b这两个变量
cout<<"得到的a和b的值分别为:"<<a<<" "<<b<<endl;
}
//这个是前置的++运算
//以下是一元运算符的重载的情况
comp &operator++(){//comp这个类的属性值自加一
this->a++;
this->b++;
return *this;
}
//下面这个是后置的++运算
comp &operator++(int){//多添加一个占位符,编译器看到之后就会对这种情况进行判断
comp temp=*this;
this->a++;
this->b++;
return temp;//效果是先赋值在加一
}
//二元运算符的重载
//先将下面的重载注释掉,不然会出现多个重载的情况,导致编译器不知道使用哪一个重载的
//下面这个是成员函数的运算符的重载
//
comp &operator+(comp &b){
//
return *(new comp(this->a+b.a,this->b+b.b));
//}
private:
int a;
int b;
};
//输出运算符的重载
ostream& operator<<(ostream &out,comp &thi){//返回的当左值所以要返回为引用的类型
out<<"得到的a和b的值分别为:"<<thi.a<<" "<<thi.b;
return out;
}
//二元运算符的重载
//这个是全局函数的运算符的重载
comp &operator+(comp &a,comp &b){
return *(new comp(a.a+b.a,a.b+b.b));
}
comp &operator--(comp &a){//comp这个类的属性值自减一
a.a--;
a.b--;
return a;
}
void main(){
comp t1(1,2),t2(2,3);
comp t3=t1+t2;
t3.printC();
cout<<t1<<endl;
system("pause");
}