c++(十一)、运算符的重载

一、运算符重载

1、运算符重载简介

我们接触过函数的重载,而运算符的重载和函数重载是有区别:

相同点:运算符可以看做是函数;

不同点:a、语法上有区别,运算符重载分为中缀式(a * b)、前缀式(*a b)和后缀式(a b*);

              b、不能自定义新的运算符(只能重载);

             c、函数可以重载和重定义产生任何想要的结果,但运算符作用于内置类型的行为不能修改。

并不是所有的运算符都可以被重载,可重载的运算符如下所示:

a、类型转换运算符;

b、new/delete、new[]/delete[];

c、用户自定义的字面量运算符;

d、一般运算符(eg.+,-,*,/,%,^,&,!,~,=,<,>,+=,<<,>>=,==,!=,&&,->*,(),[] and so on)

不可重载的运算符:

类属关系运算符(.)、成员指针运算符(.*)、作用域运算符(::)、条件运算符(? :)和编译预处理符号(#)

当做运算符重载时有以下限制:a、优先级和结合性不变;b、不可创造新的运算符。

运算符函数的调用形式如下:

        下表中@是表示所有匹配运算符的占位符;@a为所有前缀运算符,a@为所有后缀运算符,a@为除->以外的所有后缀运算符,a@b为除=以外的所有其他运算符。

表达式作为成员函数作为非成员函数示例
@a(a).operator@()operator@(a)!std::cin调用std::cin.operator!()
a@b(a).operator@(b)operator@(a,b)std::cout<<42 调用std::cout.operator<<(42)
a=b(a).operator=(b)不能非成员std::string s;s = "abc";调用s.operator=("abc")
a(b...)(a).operator()(b...)不能非成员std::random_device r;auto n=r();调用r.operator()()
a[b](a).operator[](b)不能是非成员std::map<int ,int> m;m[1] = 2;调用m.operator[](1)
a->(a).operator->()不能是非成员auto p=std::make_unique<S>();p->bar;调用p.operator->()
a@(a).operator@(0)operator@(a,0)std::vector<int>::iterator i = v.begin();i++调用i.operator++(0)
    

2、左纯、纯右值和将亡值

c++11中的左值:指定了一个函数或对象,并且它是一个可以取地址的表达式;

//左值例子;
int Lv1{42};
int& Lv2{Lv1};//对象引用的左值;
int* Lv3{&Lv2};//指向对象的指针;
int& Lv4()//返回左值引用的函数;
{ return Lv1;}

左值的例子:

a、解引用表达式*p;

b、字符串字面量"abc";

c、前置自增/自减表达式++i/--i;

d、赋值或符合运算符表达式(x=y 或 m+=n)

c++11中的纯右值:是不和对象相关联的值(字面量)或者其求值结果是字面量或者一个匿名临时对象;

纯右值的例子:

a、除字符串字面量以外的字面量;

b、返回非引用类型的函数调用 int f();

c、后置自增自减表达式i++/i--;

d、算术/逻辑、关系表达式(a+b, a&&b, a<b)

e、取地址(&x)。

左值可以当成右值使用;

c++11中的将亡值:指定一个对象,是一个纯右值转换为右值引用的表达式。

//将亡值
int prv(int x) {return 6*x;}//纯右值;
int main()
{
    const int& Lvr{21};//常量左值引用可引用纯右值;
    int& Lvr2{22};//err,非常量左值引用不可引用纯右值;
    int&& rvr{22};//右值引用可以引用纯右值;
    int& Lvr3{prv(2)};//err,非常量左值不可引用纯右值;
    int&& rvr2{prv(2)};//右值引用普通函数返回值
    rvr = ++rvr2;//右值引用做左值使用
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值