Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.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++ cli cli/c++;增量运算符重载_C++ Cli_Overloading_Increment_Ref - Fatal编程技术网

C++ cli cli/c++;增量运算符重载

C++ cli cli/c++;增量运算符重载,c++-cli,overloading,increment,ref,C++ Cli,Overloading,Increment,Ref,我有一个关于cli/c++环境中运算符重载的问题 static Length^ operator++(Length^ len) { Length^ temp = gcnew Length(len->feet, len->inches); ++temp->inches; temp->feet += temp->inches/temp->inchesPerFoot; temp->inches %= temp->inchesPer

我有一个关于cli/c++环境中运算符重载的问题

static Length^ operator++(Length^ len)
{
   Length^ temp = gcnew Length(len->feet, len->inches);
   ++temp->inches;
   temp->feet += temp->inches/temp->inchesPerFoot;
   temp->inches %= temp->inchesPerFoot;
   return temp;
}
(代码来自ivor horton的书。)

为什么我们需要在堆上声明一个新的类对象(temp)来返回它?
我在谷歌上搜索了有关重载的信息,但实际上没有太多信息,我觉得有点不知所措。

是的,因为你在这里加载了重载POST-increment操作符。因此,原始值可能会在代码中大量使用,复制并存储在其他地方,尽管存在新值。例如:

store_length_somewhere( len++ );

len
将增加时,函数可能会将原始值存储在其他位置。这意味着您可能同时需要两个不同的值。因此,创建并返回一个新的值。

这就是.NET中实现运算符重载的方式。重载运算符是静态函数,它返回一个新实例,而不是更改当前实例。因此,post和prefix++运算符是相同的。关于操作符重载的大部分信息都是关于本地C++的。您可以查看.NET特定信息,查找C#示例,例如:
NET GC允许创建许多轻量级的新实例,这些实例将自动收集。这就是为什么.NET重载运算符比在本机C++中更简单。

当你写“代码> ^ < /CODE >时,你是指<代码>和<代码>吗?“CLI”在上下文中是否与“命令行接口”不同,这是标签wiki描述它的含义?我把它理解为OP正在编写一个控制台程序(这是不相关但可以想象的)。不,@Henning,书中的代码说^-这是一个手艺我对编程很陌生,但在书中它被描述为.net的一部分environment@Henning它是一个内置垃圾收集的C++方言。
^
表示指向垃圾收集对象的指针。谢谢,Kornel。但是在书中,它说,“在C++中添加超载和递减运算符比在本地C++中更简单。只要你将运算符函数实现为静态类成员,同样的函数就可以充当PIFI X和PFIFX X运算符函数。”---那么,我如何重载作为PRE-fix编写的一个呢?我将两者兼用,但为了确保它运行良好,您需要将结果创建为一个新对象。虽然性能不太友好,但可以完成任务。在MC++中,您无法区分前置和后置。这里有一篇关于重载的大文章