4-1 运算符

科技资讯 投稿 23600 0 评论

4-1 运算符

1 运算符的重载

*用于地址,就可以得到存储在这个地址中的值;用在两个数字上时,得到的是乘积的效果。

operator op(argument-list

operator +( 重载+运算符,operator *()重载*运算符。

Box类,为它定义一个operate+(成员函数来重载+运算符,以便实现两个对象的长宽相加。

class Box{
public:
    int length;
    int width;

    Box operator+(const Box& box1{
        Box box;
        box.length=this->length+box1.length;
        box.width=this->width+box1.width;
        return box;
    }
};

如果box2box3sum都是类对象,就可以编写这样的等式:

sum=box2+box3;

//编译器行为
sum=box2.operator+(box3;

可见重载的目的就在于改变其内部操作的效果,但要注意像运算符优先级这种是无法改变的。

2关联性与优先级

a+b*c先运行乘法再加法,但我们可以用(将a+b关联起来先运行。运算符的优先级有很长一串,很多时候不可能完全记住,C++Primer在这一方面的建议是:当你拿捏不准时,通通用括号来实现你想要的运算顺序

3 注意事项

比如

int i=0;
cout<<i<<" "<<++i;

编译器会发出警告Unsequenced modification and access to 'i',因为它不知道是该先输出还是先进行++的操作。

string s="helloworld";

auto beg = s.begin(;
while(beg!=s.end({
   *beg = toupper(*beg++;
}

在这个大小写转换的代码中,我们希望先进行*beg = toupper(*beg,再进行beg++的操作。但是由于我们在同一句话里使用且改变beg,编译器很有可能会先进行beg++的操作,再进行*beg = toupper(*beg

  1. ||、&&

a||b,如果已经知道a的值判断为1,那么无论b是0还是1都不会对最终的结果产生影响,同理对于a&&b,如果已经知道a的值判断为0,那么b无论是1还是0都对最终的结果没有影响。

  1. 执行顺序

g(+f(*m(-n(;

在这样的式子里编译器不会确保先调用哪个函数,如果在这几个函数里有些有关联的话,比如说m(函数依赖于g(函数得到的某个值,那么建议最好分开写,在获得每一个函数的返回值后再进行最终的运算。

编程笔记 » 4-1 运算符

赞同 (100) or 分享 (0)
游客 发表我的评论   换个身份
取消评论

表情
(0)个小伙伴在吐槽