Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/152.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++ 运算符的返回值+;()过载_C++_Operator Overloading_Return Value - Fatal编程技术网

C++ 运算符的返回值+;()过载

C++ 运算符的返回值+;()过载,c++,operator-overloading,return-value,C++,Operator Overloading,Return Value,如果date类的operator+()成员函数未返回任何内容,为什么编译器不返回错误。如果我这样做 date d1,d2; date any = d1 + d2; 然后,d1+d2将创建一个临时文件,这个临时文件用什么初始化 date operator+(date d) { day += d.day; month += d.month; year += d.year; } 注:仅用于测试目的。不用于商业用途或任何用途。因为它是运算符+()而不是运算符+=

如果
date
类的
operator+()
成员函数未返回任何内容,为什么编译器不返回错误。如果我这样做

date d1,d2;
date any = d1 + d2;
然后,
d1+d2
将创建一个临时文件,这个临时文件用什么初始化

date operator+(date d)  
{  
    day += d.day; 
    month += d.month; 
    year += d.year; 
}

注:仅用于测试目的。不用于商业用途或任何用途。

因为它是
运算符+()
而不是
运算符+=()
,所以您应该创建一个临时值并返回相同的值:

date operator + (const date &d) const
{            //  ^^^^ 1         ^^^^^ 2
  date temp = *this;  // copy current object
  ...
  return temp;  // important: -Wall warned you for missing 'return'
}
您还可以看到另外两个重要的更改:

(1) 将
d
作为
const
参考传递;因为你不需要另一份

(2) 通过在末尾添加
const
运算符+
设置为
const
正确;因为您不打算修改此对象

更新:对于您更新的问题,这里有一个链接可以解答


日期类的以下重载运算符应该返回什么?我看到它返回垃圾。

您没有从函数返回任何内容,因此返回的值是任何randowm值,并且它是一种未定义的行为

您应该使用以下命令显式返回类型为
Date
的对象:

return objName;

您正在修改
+
的第一个操作数,这是不正确的。获取副本并将其返回:

date operator+(date d) const { 
    date r = *this;
    r.day += d.day; r.month += d.month; r.year += d.year;
    return r;
}

类型为
date
的对象


您应该构造一个新的日期,而不是对各个组件执行
+=
。这是因为您希望+运算符的行为与数字的+运算符的行为相同。

除了创建要返回的新对象之外,别无选择。
不要担心复制临时对象,大多数编译器都会在这里使用NRVO。

+1用于使用引用常量参数。太多人对非预定义类型使用“堆栈”非引用非指针参数!可能值得补充的是,这里常用的习惯用法是1)使
操作符+
成为一个自由函数(但这当然不是必需的,除非有到
日期的隐式转换),2)根据
操作符+=
实现它。(您还有几个
数据
的实例,应该是
日期
)+1,如果日期只有几个字节,则示例代码具有运算符+@vulkanino的正确函数原型,传递值可能很快。我还认为您需要重新考虑您的实现——否则您将得到奇怪的结果,比如15个月的第60个月!添加日期有什么意义?