例如:
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 ++的新手。 任何帮助都会很好。
答案 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
的引用。
为了使用用户制作的类型复制此行为,赋值运算符需要返回引用。