2017-05-25 42 views
1

你好,我有一个类Truck只有一个属性int类型。我没有在全班使用任何指针。我已经写了2个版本的operator=的:转让运营商的业绩

Truck& operator=(Truck &x) 
    { 
    if(this != &x) 
    {   
     price=x.getPrice(); 
    } 
    return *this; 
    } 

Truck operator=(Truck x) 
    { 
    if(this != &x) 
    {    
     price=x.getPrice();    
    } 
    return *this; 
    } 

他们两人的工作,但有没有跟他们任何人任何性能问题?而且,如果我使用指针来声明我的属性,我应该坚持第一种类型的声明吗?

+0

您应该从[三个规则是什么?](https:// stackoverflow。COM /问题/ 4172722 /什么,是最规则的三)。 –

+0

你需要自我分配检查吗? –

+0

参考退货成本几乎没有。对象复制返回可能很昂贵。很明显,不是吗? – ilotXXI

回答

0

方法1是赋值运算符的有效方式,但建议在此处传递常量引用。它返回对this的引用,即一个轻量级指针。

方式2可能会降低性能。它构造并返回this对象的副本。此外,它是无效的。为什么赋值运算符中的引用返回是标准签名?这让像

copy1 = copy2 = original; 
while ((one = two).condition()) 
    doSomething(); 

表情让我们考虑以下几点:

(copy = original).changeObject(); 

有了这种表达方式1就是一个程序员的期望。第二种方法是不正确的:你为分配操作符返回的临时对象调用changeObject,而不是copy

你可以说:“我不想用这样丑陋的语法”。在这种情况下,请不要允许它在operator=中返回任何内容。因此,建议返回对this的引用。

请参阅评论中的链接,它们似乎很有用。

1

他们两人都工作,但他们有没有任何性能问题 他们?

您发布的两个代码示例都存在潜在的性能问题。

由于你的类只有一个int成员,所以编写一个用户定义的赋值运算符,无论它看起来如何写得好,都可能比编译器的默认版本要慢。

如果你的类不需要你编写用户定义的赋值操作符(或拷贝构造函数),那么自己编写这些函数更为明智,因为编译器这些天内在知道如何优化它们自己的例程生成。

与析构函数相同的东西 - 看起来似乎无害的空析构函数几乎可以看成是一个膝盖反应,它会影响性能,因为它再次覆盖了编译器的默认析构函数,该函数被优化以执行任何操作需要做的。

因此,底线是当编译器独立于这些函数时。如果复制/分配功能的编译器默认版本足够,则不要通过编写自己的版本来进行干预。有可能编写错误的东西(比如遗漏你可能无法复制的成员),或者做比编译器产生的效率低的东西。