C ++:使用'。'表达式和函数调用的运算符

时间:2011-02-21 19:05:10

标签: c++ performance coding-style operator-keyword class-members

我想知道使用成员运算符.是否是一个好习惯:

someVector = (segment.getFirst() - segment.getSecond()).normalize().normalCCW();

只是为了展示我想知道的两件事,即使用(expressions).member/function()foo.getBar().getmoreBar()是否符合可读性和可维护性的精神。在我从中学到的所有c ++代码和书籍中,我从未见过以这种方式使用它,但它的使用方式却令人陶醉。不过,不想养成任何坏习惯。

可能比这更重要(或更少)重要,我也想知道是否会以这种方式使用它会有任何性能上的提升/损失,或者会在程序中引入错误的无法预料的陷阱。

提前谢谢!

8 个答案:

答案 0 :(得分:4)

  

或不可预见的陷阱会将错误引入程序

嗯,可能的陷阱是

  1. 难以调试。您将无法查看每个函数调用的结果,因此如果其中一个函数返回了意外情况,您将需要将其分解为更小的段以查看正在发生的事情。此外,链中的任何呼叫都可能完全失败,因此您可能需要将其分解以找出哪个呼叫失败。

  2. 难以阅读(有时)。链接函数调用可以使代码更难阅读。这取决于具体情况,这里没有硬性规定。如果表达式甚至有些复杂,那么就很难理解。阅读您的具体示例我没有任何问题。

  3. 最终归结为个人偏好。我并不努力在一条线上尽可能地适应,而且我已经被咬了很多次,因为我不应该将链接分解。但是,对于不太可能失败的简单表达式,链接很好。

答案 1 :(得分:3)

是的,这是完全可以接受的,如果你不这样做,事实上在很多情况下都是完全不可读的。

这叫做方法链。

可能会有一些性能提升,因为你没有创建临时变量。但无论如何,任何有能力的编译器都会优化它。

答案 2 :(得分:1)

以你展示的方式使用它是完全有效的。例如,它在C ++ faq lite中描述的named parameter idiom中使用。

不总是使用的一个原因是,出于性能原因必须存储中间结果(如果标准化成本高,并且您必须多次使用它,最好将结果存储在变量中)或可读性

MY2C

答案 3 :(得分:1)

someVector = (segment.getFirst() - segment.getSecond()).normalize().normalCCW();

不是你问题的答案,但我应该告诉你 根据C ++标准,表达式(segment.getFirst() - segment.getSecond())的行为没有很好地定义。标准对未指定的每个操作数的评估顺序

另请参阅此相关主题:Is this code well-defined?

答案 4 :(得分:1)

使用变量来保存中间结果有时可以提高可读性,尤其是在使用好的变量名称时。过度链接会使得很难理解正在发生的事情。您必须使用您的判断来决定是否有必要使用变量来分解链。你上面提到的例子对我来说并不过分。如果启用优化,性能不应该有太大差异。

答案 5 :(得分:0)

我认为你所做的事情的可读性较差,但另一方面,太多的临时变量也会变得不可读。

到目前为止,我确信在制作临时变量时会有一点开销,但编译器可以优化它。

答案 6 :(得分:0)

以这种方式使用它没有什么大问题 - 一些API从方法链中受益匪浅。另外,创建变量会产生误导,然后只使用一次。当有人读下一行时,他们不必考虑你现在没有保留的所有变量。

答案 7 :(得分:0)

这取决于你正在做什么。

为了便于阅读,您应该尝试使用中间变量 将计算结果分配给指针,然后使用它们。