0

例如:

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++ 的新手。你能帮忙的话,我会很高兴。

4

6 回答 6

3

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

这段代码

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

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

于 2013-10-09T20:10:42.410 回答
2

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

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

a = *(b = c);

Ball *pa;
Ball *pb;

pa = pb;

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

于 2013-10-09T20:11:15.697 回答
0

你可以这样定义它:

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

但是,您将返回一个临时副本。编译器在优化时可能会为您解决此问题。此外,链接a = b = cwhenoperator=需要 a const Ball&,您正在传递对临时的引用。

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

于 2013-10-09T20:14:47.117 回答
0

如果你有一个 const 引用,那么你不能分配给它。如果你返回一个指针,同样,你分配的是指针值,而不是对象实例。

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

于 2013-10-09T20:07:50.623 回答
0

如果你有参考,你可以chain你的操作,像这样

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

但是如果你返回一个指针或常量,你就不能那样做。

于 2013-10-09T20:08:57.747 回答
0

这个片段是合法的:

int a;
(a = 2)++;

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

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

于 2013-10-09T20:15:44.273 回答