operator =通常在C ++中返回对象引用的原因?

时间:2013-10-09 20:05:46

标签: c++ operator-overloading

例如:

const Ball& operator=(const Ball& other)
{
   // Irrelevant code

   return *this;
}

所以我听说你因为级联而返回对象的引用:

Ball a,b,c;
// Unimportant initializations
a=b=c;

但为什么这个方法不能像:

const Ball operator=(const Ball& other)
{
   // Irrelevant code

   return *this;
}

或者这个:

const Ball* operator=(const Ball& other)
{
   // Irrelevant code

   return this;
}

如果我这样做会怎么样?

Ball *a, *b, *c;
// Unimportant initializations
a = b;

这是否适用于我提供的两种方法?

如果这些是愚蠢的问题,我道歉。我仍然是C ++的新手。 任何帮助都会很好。

6 个答案:

答案 0 :(得分:3)

返回类型是惯例,但通常是Ball&而不是const Ball&。我认为你可以拥有任何你喜欢的东西(例如,如果你根本不想归还任何东西,那就是无效的)。但是最好有一些行为类似于赋值运算符的内置类型。这样人们就不会对你的赋值操作符的行为感到惊讶。

此代码

Ball *a, *b, *c;
// Unimportant initializations
a = b;

只是指针赋值,它总是合法的,但它与你定义的任何赋值运算符无关,而Ball对象不是Ball指针。

答案 1 :(得分:2)

按值返回会有效,但您会制作不必要的副本。

通过指针返回会阻止自然链接,你需要一些奇怪的东西,比如

a = *(b = c);

Ball *pa;
Ball *pb;

pa = pb;

不会使用您的用户定义的赋值运算符,指针的赋值运算符是内置的并执行指针赋值。

答案 2 :(得分:0)

如果您有const引用,则无法分配它。如果再次返回指针,则指定指针值,而不是对象实例。

在大多数情况下,坚持使用所谓的“int语义”是有意义的,而你的类的行为方式与int相同。特别是,您希望级联工作。

答案 3 :(得分:0)

如果您有参考,可以chain您的操作,例如

  a.add(b).subtract(c);

但是如果你返回一个指针或const,你就不能这样做。

答案 4 :(得分:0)

您可以这样定义:

const Ball operator=(const Ball& other)
{
   // Irrelevant code
   return *this;
}

但是,您将返回临时副本。编译器可能会在优化时为您解决此问题。此外,当a = b = c占用operator=时,将const Ball&链接起来,即表示您正在传递对临时的引用。

返回指针将无法正常工作,因为您无法链接,并且您正在处理不同的数据类型(左侧的指针,右侧的const引用)。

答案 5 :(得分:0)

此代码段是合法的:

int a;
(a = 2)++;

在一个声明中,我们将2分配给a,然后递增a。这意味着a = 2必须评估为对a的引用。

为了使用用户制作的类型复制此行为,赋值运算符需要返回引用。