Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/153.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 返回对象的副本';s self在C++;_C++_Reference_Return Value - Fatal编程技术网

C++ 返回对象的副本';s self在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

好的,我用谷歌搜索了这个问题,搜索了堆栈溢出,但似乎找不到好的答案。所以,我在这里问一个问题,这是我的问题所特有的。如果这是一个简单的答案,请友好,我是新的语言。我的问题是:

<>我试图为C++类编写一个方法,它重载运算符。我想返回已修改实例的副本,但不返回实例本身。为了简化示例,我将使用
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++将返回值从调用的堆栈帧复制到上一个堆栈帧。基本上这意味着,当您没有指针时,对象在返回时被复制。(指针等基本体也会被“复制”,但您不会注意到,因为它们只指向同一个对象。)