深圳幻海软件技术有限公司 欢迎您!

C++(运算符重载)

2023-03-25

在C++里面所有的运算符号,如+、-、*、/、<<等等都是可以通过函数赋予其不同的功能的,而这种函数赋予的功能可以通过运算符号直接使用,这就是运算符重载+运算符重载classCar{public:inta;intb;//成员函数进行运算符重载Caroperator+(const&

在C++里面所有的运算符号,如+、-、*、/、<<等等都是可以通过函数赋予其不同的功能的,而这种函数赋予的功能可以通过运算符号直接使用,这就是运算符重载

+运算符重载

class Car
{
public:
int a;
int b;
//成员函数进行运算符重载
Car operator+(const &c)
{
Car temp;
temp.a =this->a + c.a;
temp.b =this->b + c.b;
return temp;
}
};

Car c1;
c1.a=1;
c1.b=2;

Car c2;
c2.a=1;
c2.b=2;
//c3属性等于c1和c2对象属性相加
Car c3=c1+c2;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

当然,全局函数的运算符重载也很好用

//注意加法可以没有先后顺序,但是像右移运算符这些不可以没有顺序,c1在前,c2在后
Car operator+(const &c1,const &c2)
{
Car temp;
temp.a =c1.a + c2.a;
temp.b =c1.b + c2.b;
return temp;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

左移运算符重载<<

//左移运算符重载————全局函数的重载
//调用时应该是cout<<c;但是顺序不能反过来,不可以c<<cout,这是不对的
ostream & operator<<(ostream &out,Car &c)//引用只是别名,随便写,重点是使用运算符的时候是把ostream类型的cout这个输出用的对象传进来
{
out<<"a=\t"<<c.a<<"b=\t"<<c.b<<endl;
return out;
}

//左移运算符重载————成员函数的重载
//这种方法不合适,因为这种方法调用运算符时代码是这样:c1<<cout;输出用的cout竟然跑到后面去了,那肯定不行,
//所以用全局函数的时候可以改变顺序
ostream & operator<<(ostream &out)
{
out<<"a=\t"<<c.a<<"b=\t"<<c.b<<endl;
return out;
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

递增运算符重载++

++符号有前置和后置

class Integer
{
public:
Integer(){num=0;}
//类似++i的实现,先加1,再返回当前对象可以用链式操作如
//Integer i;++(++i);
Integer& operator++()
{
num++;
return *this;
}
//类似与i++的实现,由于两个函数本来都没有形参,无法形成函数重载的条件
//所以使用占位运算符int来区别不同的函数,有int代表的是后置运算符,但是这种后置的返回不是当前对象,所以无法链式操作,如(i++)++是不行的
Integer operator(int)
{
Integer temp=*this;
num++;
return temp;
}
private:
int num;
};
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

赋值运算符重载

class Car
{
public:
Car(int num)
{
num = new int(num);
}
Car& operator=(Car &c)
{
if(num != NULL)
{
delete num;
num = NULL;
}
//深拷贝,重新为本对象开辟堆内存
num = new int(*c.num);
//返回本对象
return *this;
}
int* num;
};
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

关系运算符重载

关系运算符有==、!=、<、>、>=、<=等等

class Car
{
public:
int num;
string name;
};
bool operator==(Car& c)
{
if(this->num==c.num && this.name==c.name)
{
return true;
}
return false;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

函数调用运算符重载

函数调用运算符就是(),运算符重载后调用方法和函数相似,称为仿函数

class Car
{
public:
int num;
int operator()(int num1,int num2)
{
return num1+num2;
}
};

Car c;
cout<<c(1,2);//输出结果为3
//仿函数和真正的函数不同的是,仿函数是通过类来调用的,小括号前面是类对象名称,而函数的小括号前面是函数名称
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13