C++运算符重载

C++运算符重载

开发工具与关键技术:C++、VisualStudio
作者:何任贤
撰写时间:2019年06月01日
运算符重载的意思是我们在使用自定义类时,是无法使用直接使用运算符对自定义类进行运算,但是并不是所有的运算符都可以进行重载的。

在这里插入图片描述

运算符重载不能改变运算符的优先级、不能改变运算符的结合性、不能改变运算符的操作数以及不能创建新的运算符。
运算符的优先级的意思是谁的优先级高那么在执行时,就优先执行优先级高的,例如+、-、*、/的执行顺序,就是根据优先级进行的。
运算符的结合性:同一优先级的运算符,运算次序由结合方向所决定,例如:a=b=c=d根据结合性它的执行顺序应该是(a=(b=(c=d)))而不是其他的执行顺序,那么赋值运算符是右结合的。
运算符的操作数:比如赋值操作符的操作数是2,运算符的操作数意思就是至少要有多少个变量才能执行。
那么运算符重载一般是在自定义类中重载,目的就是使自定义类创建的对象可以使用运算符进行运算,我们知道自定义类的有两种函数,一种成员函数,一种是友元函数,所以可重载运算符要根据运算符特性来选择使用哪种函数进行重载,但是有些可重载运算符只能用成员函数。
只能用成员函数重载的有:= () [] ->
下面我用+、-、=、++、<<、>>做一个运算符重载例子:
#include
using namespace std;
class tast
{
public:
tast() { b = 0; };
tast(int a) { b = a; };
int b;
tast operator + (const tast &);
friend tast operator - (const tast &, const tast &);
tast & operator = (const tast &);
tast operator ++ ();
tast operator ++ (int);
friend ostream & operator << (ostream & out, tast &);
friend istream & operator >> (istream & in, tast &);
};
tast tast::operator + (const tast &x)
{
this->b += x.b;
return *this;
}
tast operator - (const tast &x, const tast &y)
{
return x.b - y.b;
}
tast & tast::operator = (const tast &x)
{
this->b = x.b;
return *this;
}
tast tast::operator ++ ()
{
++this->b;
return *this;
}
tast tast::operator ++ (int)
{
int a = this->b;
++this->b;
return a;
}
ostream & operator << (ostream & out, tast &x)
{
out << x.b;
return out;
}
istream & operator >> (istream & in, tast &x)
{
in >> x.b;
return in;
}

上面是自定义类、函数原型和函数定义。
先是+ 、- 、= 的重载,这里我“+” 和“=”用的是成员函数重载,“-”用的是友元函数重载,那么友元和成员函数重载的区别

在这里插入图片描述
我们可以看到的是,被友元函数重载的“-”不管是被减数是常量或者减数是常量都没有问题,但是被成员函数重载的“+”在10+a时报了一个错误,意思是10不能和自定义类型相加,为什么自定义类加5又可以呢?因为我重载“+”运算符用的是成员函数,它的定义是this->b += x.b; return *this;第一个数是this指针指向的,而this指针无法指向常量,而参数可以是常量的,所以10 +a 时不可以a+10却可以的原因,这也是“=”只能用成员的原因,我们知道“=”左边必须是可以修改的值,所以“=”只能用成员函数重载,那么“-”一般都是用友元函数重载,因为10-a和a-10得出来的值是完全不一样的。
至于“++”的主要是它有点不一样的是,它的后置“++”和前置“++”效果是不一样的它们是通过给参数表加一个无用参数并且是(int)来区别它们是哪一个,那么没有的是前置“++”,有参数的是后置“++”。
至于“<<”和“>>”运算符,它们必须声明为友元函数不能声明为成员函数,它们的返回值和其他运算符重载的不一样,“<<”运算符重载返回的是ostream,“>>”运算符重载返回的是istream。
以上就是关于运算符重载内容,下面是以上运算符重载的主函数和输出结果。
void main()
{
tast a;
cin >> a;
cout << "a : " << a << “\n”;
cout << "a +10 : " << a + 10 << “\n”;
cout << "10 - a : " << 10 - a << “\n”;
cout << "a = 10 : " << (a = 10) << “\n”;
cout << "a++ : " << a++ << “\n”;
cout << "++a: " << ++a << “\n”;
}

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值