看了看C#的运算符重载,发现与C++打不相同.刚刚被C#的自增操作符坑了,现在来分享一下.

先定义一个类

    class A
{
public int i; public A(int I)
{
i = I;
}public static A operator ++(A a)
{
return new A();
}
}

主函数

    class Program
{
static void Main(string[] args)
{
A v = new A();
Console.WriteLine(v.i); v++;
Console.WriteLine(v.i); Console.ReadKey();
}
}

说实话,一开始我预测的答应结果完全不对

我以为v.i的值还是10,即打印两个10

结果

真正的打印结果是:

这完全出乎我这C++程序员的意料之外

因为调用 v++ 时,我认为看具体重载方法[ public static A operator ++(A a) ] 这里就一句 return new A(100);完全看不出和 v 有半毛钱的关系.

........

琢磨了许久原来是这样的:

假设有这样一个静态方法在类A中:

public static A F(A a)
{
return new A();
}

那么

v++这一就可以等价的写为 v = A.F(v);

即:把v作为参数调用了操作符的方法,接着把返回值赋给了v;

就是这样的,v的值最后被换掉了,所以说C#的操作符重载可以看作是一种错觉得来的.

这也就是为什么重载++操作符返回类型必须是包含类型或从包含类型派生的类型的原因了吧.

C# 中重载自增自减操作符的具体运算原理 ----从C++程序员的角度看C#自增操作符重载的实质的更多相关文章

  1. 大型情感剧集Selenium:6_selenium中的免密登陆与cookie操作 #华为云·寻找黑马程序员#

    欢迎添加华为云小助手微信(微信号:HWCloud002 或 HWCloud003),输入关键字"加群",加入华为云线上技术讨论群:输入关键字"最新活动",获取华 ...

  2. 从项目经理的角度看.net的MVC中Razor语法真的很垃圾.

    我们知道,Razor语法中我们可以直接使用@if(){}等代码段,这使得.net程序员在写模版时更容易了. 对比如下: 语法名称 Razor 语法 Web Forms 等效语法 代码块(服务端) @{ ...

  3. C++ Primer 学习笔记_61_重载操作符与转换 --自增/自减操作符

    重载操作符与转换 --自增/自减操作符 引言: 自增,自减操作符常常由诸如迭代器这种类实现,这种类提供相似于指针的行为来訪问序列中的元素.比如,能够定义一个类,该类指向一个数组并为该数组中的元素提供訪 ...

  4. cc22a_demo_c++重载自增自减操作符-代码示范

    cc22a_demo_c++重载自增自减操作符-代码示范 #define _CRT_SECURE_NO_WARNINGS #include <iostream> using namespa ...

  5. C++学习30 重载++和--(自增自减运算符)

    自增“++”和自减“--”都是一元运算符,它的前置形式和后置形式都可以被重载.请看下面的例子: #include <iostream> #include <iomanip> u ...

  6. 【Java】【4】关于Java中的自增自减

    摘要:理解j = j++与j = ++j的区别:正确用法:直接用j++,不要用前两种 正文: import java.util.*; public class Test{ public static ...

  7. C++ 类型转化(运算符重载函数)和基本运算符重载(自增自减)

    类型转化(运算符重载函数) 用转换构造函数可以将一个指定类型的数据转换为类的对象.但是不能反过来将一个类的对象转换为一个其他类型的数据(例如将一个Complex类对象转换成double类型数据).在C ...

  8. c中自增自减的妙用

    #include <stdio.h> int main() { ; printf("%d,%d,%d,%d",i++;i--;++i;--i); /*运算从右往左运算 ...

  9. Java中的自增自减

    情况①: for (int i = 0; i < 100; i++) { j = 1 + j++; } System.out.println(j); 结果是 0 !! 这是由于在进行后自增/自减 ...

随机推荐

  1. Python爬虫常用之登录(二) 浏览器模拟登录

    浏览器模拟登录的主要技术点在于: 1.如何使用python的浏览器操作工具selenium 2.简单看一下网页,找到帐号密码对应的框框,要知道python开启的浏览器如何定位到这些 一.使用selen ...

  2. MIUI7系统如何刷入开发版启用root超级权限

    小米的手机或平板不同手机型号通常情况MIUI官方论坛都提供两个不同系统,大概可分为稳定版和开发版,稳定版没有提供root权限管理,开发版中就开启了root权限,很多情况我们需要使用的一些功能强大的AP ...

  3. CDH集群安装配置(五)- Cloudera Manager Server

    在线安装 sudo yum install cloudera-manager-daemons cloudera-manager-server 离线安装 资源下载地址 https://archive.c ...

  4. mouseover和mouseenter闪烁的问题

    span标签绑定mouseover/mouseout事件,显示/隐藏一个信息框div 该div下没有任何子元素 悬停上去一直闪烁,改成mouseenter也没用. 照成的原因是:悬停上去信息框div盖 ...

  5. HTTP请求的常用方法有哪些

    HTTP请求的常用方法有:GET方法.POST方法.HEAD方法.PUT方法.DELETE方法.CONNECT方法.OPTIONS方法.TRACE方法.下面本篇文章就给大家介绍具体介绍一下HTTP请求 ...

  6. 递归迭代vector三种方法实现二路归并排序

    https://mp.csdn.net/mdeditor/84933084# 附链接

  7. 《JavaScript编程精解》读书笔记

    第一章 JavaScript基础:值.变量.控制流程 JavaScript里有六种基本类型:number类型.string类型.boolean类型.object.function和undefined. ...

  8. Oracle 数据库、表、方案的逻辑备份与恢复

    数据库(表)的逻辑备份与恢复 逻辑备份是指使用工具export将数据对象的结构和数据导出到文件的过程,逻辑恢复是指当数据库对象被破坏而使用工具import利用备份的文件把数据对象导入到数据库的过程,逻 ...

  9. CSS ::Selection的使用方法

    大家都知道浏览器对选中的文本默认样式都是统一的,Windows下是一个深蓝色的背景,白字的前景,而在Mac下是一个淡蓝色背景,白色字体,就如上图所展示的一样,自从有了这个“::selection”选择 ...

  10. [转]error MSB4018: The "GenerateResource" task failed unexpectedly

    本文转自:https://github.com/Microsoft/msbuild/issues/364 After uninstall Visual Studio 2015 Update 1 RC ...