C++ 返回对象的副本';s self在C++;
好的,我用谷歌搜索了这个问题,搜索了堆栈溢出,但似乎找不到好的答案。所以,我在这里问一个问题,这是我的问题所特有的。如果这是一个简单的答案,请友好,我是新的语言。我的问题是: <>我试图为C++类编写一个方法,它重载运算符。我想返回已修改实例的副本,但不返回实例本身。为了简化示例,我将使用C++ 返回对象的副本';s self在C++;,c++,reference,return-value,C++,Reference,Return Value,好的,我用谷歌搜索了这个问题,搜索了堆栈溢出,但似乎找不到好的答案。所以,我在这里问一个问题,这是我的问题所特有的。如果这是一个简单的答案,请友好,我是新的语言。我的问题是: 我试图为C++类编写一个方法,它重载运算符。我想返回已修改实例的副本,但不返回实例本身。为了简化示例,我将使用BigInt类来演示我遇到的问题 如果我有以下代码: const BigInt & operator+() const //returns a positive of the number { Bi
BigInt
类来演示我遇到的问题
如果我有以下代码:
const BigInt & operator+() const //returns a positive of the number
{
BigInt returnValue = *this; //this is where I THINK the problem is
returnValue.makepositve(); //for examples sake
return returnValue;
}
我得到一个错误,返回值可能是在堆栈上创建的。我知道这意味着我必须在堆上创建对象并返回引用。但是如果我把第三行改成:
BigInt & returnValue = *this;
我得到一个错误,告诉我语法不正确。我真的不知道该怎么办,非常感谢您的帮助 试试看
BigInt * returnValue = this;
<>我的C++有点生疏了,但是:怎么样?
BigInt* returnValue = new BigInt(this)
...
return *returnValue;
问题在于函数签名。您确实需要返回整个对象,而不仅仅是一个引用 您的函数将如下所示
BigInt operator+() const //returns a positive of the number
{
BigInt returnValue = *this;
returnValue.makepositve(); //for examples sake
return returnValue;
}
您还可以将运算符的返回值设置为
BigInt
。然后,复制构造函数将在返回时自动执行:
const BigInt operator+() const //returns a positive of the number
{
BigInt returnValue = *this; //this is where I THINK the problem is
returnValue.makepositve(); //for examples sake
return returnValue;
}
现在看来,复制构造函数将发生两次,一次在运算符内部,另一次在函数返回时发生,但通过返回值优化,它实际上只会发生一次,因此从性能角度看,它是最好的。请注意,重载运算符应具有直观的语义。将一元
+
定义为“绝对值”,就像您在提供的示例代码中所做的那样,这对客户机来说是非常混乱的。用户定义类型上的运算符的行为应类似于内置类型上的运算符。例如,+(-5)
产生-5,而不是+5。因此,operator+
的实现应该如下所示:
BigInt& operator+() //returns the unchanged number
{
return *this;
}
const BigInt& operator+() const //returns the unchanged number
{
return *this;
}
如果要提供绝对值函数,请执行以下操作:
BigInt abs(BigInt x)
{
x.makePositive();
return x;
}
我试过了,但我得到的错误是:对非常量的引用的初始值必须是左值
这个是一个指针,即BigInt*
,不能分配给引用。它告诉我没有构造函数的实例与参数列表匹配。这种方法的问题是最终会泄漏内存。如何删除新创建的对象?另外,它将是新的BigInt(*this)好的,因此如果我返回整个对象,是否需要在堆上创建该对象?不,可以在堆栈上创建它。不,c/c++将返回值从调用的堆栈帧复制到上一个堆栈帧。基本上这意味着,当您没有指针时,对象在返回时被复制。(指针等基本体也会被“复制”,但您不会注意到,因为它们只指向同一个对象。)