浅析C#与C++相关概念的比较

1、在C#中,class的变量为引用类型,在C++中class的变量为值类型,如myclass mc,在C++中,mc是值类型,成员存储在程序的栈区,在C#中,mc是引用类型,指向堆中的成员。

2、switch语句,C#中case后面可根字符串,如case “abc“,但在C++中却不行,C++中case后面只跟数字,字符,和枚举。

3、在C#中没有C++中的私有继承和保护继承,只有公有继承。

4、C#中可以通过关键字sealed把一个类声明为密封类,即不能被作为父类被继承出派出类,在C++中可通过把构造函数声明为private,让其不能被作为父类被继承出派出类,且同时不能实例化,但可通过类的静态函数调用构造函数来产生实例。

5、C#支持用户自定义类型转换,可通过关键字implicit定义隐式转换,可通过关键字explicit定义显式转换。在C++中,可通过重载 = 操作符来达到隐式转换的目的。

6、在C#中,运算符重载则一定要把运算符重载函数定义为类的成员,且必须用static和public关键字修饰,且对于一元运算符重载,需要一个参数,对于二元运算符重载则需要两个参数。在C++中,运算符重载,有一个默认的隐含参数this,则一元运算符重载无需参数,二元只需一个参数。而且C#中不能重载 = 号运算符。

7、C#的catch语句有一个不带任何参数的一般catch语句,它相当于C++中的catch(...)。

8、C#中用关键字abstract来声明一个类为抽象类,抽象类不能实例化。在C++中通过声明一个纯虚函数来使一个类变成抽象类,同样不能实例化。

9、对于结构类型,即用关键字struct定义的数据结构,在C++中它与class的用法和功能相近,只是用class定义默认成员的访问权限是私有的,而stract默认成员的访问权限是公有的。而C#中class的变量是引用类型,而struct定义的变量则是值类型,成员的访问权限与class一样。注意,C#中结构不允许有析构函数。

10、对于结构类型,预定义的无参数构造函数对每个结构都存在,不能删除或重定义它,可以重载构造函数,但必须带有参数。

11、在C#中数组是对象,继承于System.Array,拥有一定的操作方法,并且数据是引用类型,引用在栈或堆上,而数组对象本身则在堆中。C++中数组只是数据或类的对象的一个集合,数组本身并不是对象,但数组中的元素可以是对象,数组本身可在栈中或在堆中。C#并不支持动态数组,而C++则可以通过new动态分配内存,实现动态数组。

12、在C#中存在一种叫接口的数据类型,它是一组函数的声明并没有实现函数的引用类型,不能实例化,只有类才能实现接口,实现接口必须实现接口中的所有声明的函数。在C++中虽然没有这种默认数据类型,但是在C++中可以自己创建一个接口类型,就是把里面的函数全部声明纯虚函数,并不含数据成员,来实现相同的功能。

13、C#中一个类可以实现多个接口,各个接口必须以‘,'分隔,如果还有基类,则基类必须写在最前面,如果多个接口中有多个相同的签名和返回类型的接口成员,类则可以实现单个成员来满足所有包含重复成员的接口。这是C#中的默认方式,也可以用点运算符来指定实现的成员所属的接口。这与C++中的多继承而产生的歧义问题相似,它并不提供这种默认的机制,在C++中则是相对自由的,你可以通过域运算符来指明你所调用的是哪个基类的成员,或是你实现的是哪个基类的成员。若你只想你的派生类对同一签名的函数或成员只有一份实现,则可以使用虚继承的方法来实现。

14、在C#中类只能单继承不能实现多继承,而对于接口,接口可以实现单继承和多继承,而实现它的类必须对接口继承体系中所有的接口成员提供实现。

15、在C#中存在叫装箱和拆箱的转换,为什么会有这两种转换,是因为C#中的变量数据有的保存在堆中(引用类型),有的则保存在栈中(值类型),当要把值类型赋给引用类型时,就要把值类型装箱,反之则需要拆箱。而且拆箱是显式转换。装箱之后,引用类型在堆中保存的值是原值类型的一个副本。在C++中则不存在这样的问题,因为变量数据默认是保存在栈中的,若要保存在堆中则需要用到指针,要赋值则需要p->data = data或(*p).data = data。也可以通过重载‘='运算符来达到隐式转换的效果。

16、在C#的泛型编程中,可用关键字where来对类型参数进行约束,例如class myclass<T1, T2, T3> where T2:cls2 where T3:In3。则只有cls2类型或其派生类型才能作为T2的实参,而只有In3接口类型才能作为T3的实参。这与C++中泛型编程中的模板特化和模板偏特化相似,在C++中可以用这样的形式实现相似的功能,class myclass<T1, cls, In3>。

(0)

相关推荐

  • C/C++与Java各数据类型所占字节数的详细比较

    C/C++的数据类型: 一,整型 Turbo C:   [signed] int 2Byte//有符号数,-32768~32767   unsigned int 2Byte //无符号数,只能表示整数0~65535 [signed] short [int] 2Byte unsigned short [int] 2 Byte long [int] 4 Byte unsigned long [int] 4 Byte Visual C++ 6.0: [signed] int 4Byte   unsig

  • C语言字符串大小比较

    C语言字符串大小比较 #include <stdio.h> #include <string.h> int fun(char *a,char *b) { int i = 0,j = 0; while(a[i]&&b[j]) { if(a[i]-b[j]>0) return 1; else if(a[i]-b[j]<0) return -1; i++,j++; } if(strlen(a)==i&&strlen(b)==j) return

  • C++基础入门教程(七):一些比较特别的基础语法总结

    这次又到了比较简单的内容了,介绍了一些基本的循环控制.关系表达式.逻辑控制等. 这里就简单抽一些稍微比较特别的内容来吹吹水,不,是来总结一下吧~ 一.i++和++i 不,我不是来解释i++和++i的区别的,只是书上提到一点,在使用for循环的时候,倒底i++和++i有没有区别呢? 答案是:几乎没有,随便你用哪一个.   但是,要稍微注意一下两种方式的内部处理方式: i++:先复制一个i的副本,然后将i加1,最后返回i的副本. ++i:将i加1,然后返回i.   这么一说,大家都知道谁的效率更高,

  • C++中十种内部排序算法的比较分析

    C++中十种内部排序算法的比较分析 #include<iostream> #include<ctime> #include<fstream> using namespace std; #define MAXSIZE 1000 //可排序表的最大长度 #define SORTNUM 10 //测试10中排序方法 #define max 100 //基数排序时数据的最大位数不超过百位: typedef struct node { int data3; int next; }

  • C++实现strcmp字符串比较的深入探讨

    strcmp的实现函数简介原型:extern int strcmp(const char *s1,const char * s2); 用法:加头文件 #include <string.h> 功能:比较字符串s1和s2.一般形式:strcmp(字符串1,字符串2)返回值: 当s1<s2时,返回值<0 当s1=s2时,返回值=0 当s1>s2时,返回值>0 即:两个字符串自左向右逐个字符相比(按ASCII值大小相比较),直到出现不同的字符或遇'\0'为止.如:"A

  • 基于C++浮点数(float、double)类型数据比较与转换的详解

    浮点数在内存中的存储机制和整型数不同,其有舍入误差,在计算机中用近似表示任意某个实数.具体的说,这个实数由一个整数或定点数(即尾数)乘以某个基数(计算机中通常是2)的整数次幂得到,这种表示方法类似于基数为10的科学记数法.所以浮点数在运算过程中通常伴随着因为无法精确表示而进行的近似或舍入.但是这种设计的好处是可以在固定的长度上存储更大范围的数.1.将字符串转换为float.double过程存在精度损失,只是float.double各自损失的精度不相同而已std::string str="8.2&

  • 浅析python协程相关概念

    这篇文章是读者朋友的python协程的学习经验之谈,以下是全部内容: 协程的历史说来话长,要从生成器开始讲起. 如果你看过我之前的文章python奇遇记:迭代器和生成器 ,对生成器的概念应该很了解.生成器节省内存,用的时候才生成结果. # 生成器表达式 a = (x*x for x in range(10)) # next生成值 next(a()) # 输出0 next(a()) # 输出1 next(a()) # 输出4 与生成器产出数据不同的是,协程在产出数据的同时还可以接收数据,具体来说就

  • 浅析C#与C++相关概念的比较

    1.在C#中,class的变量为引用类型,在C++中class的变量为值类型,如myclass mc,在C++中,mc是值类型,成员存储在程序的栈区,在C#中,mc是引用类型,指向堆中的成员. 2.switch语句,C#中case后面可根字符串,如case "abc",但在C++中却不行,C++中case后面只跟数字,字符,和枚举. 3.在C#中没有C++中的私有继承和保护继承,只有公有继承. 4.C#中可以通过关键字sealed把一个类声明为密封类,即不能被作为父类被继承出派出类,在

  • Python中协程用法代码详解

    本文研究的主要是python中协程的相关问题,具体介绍如下. Num01–>协程的定义 协程,又称微线程,纤程.英文名Coroutine. 首先我们得知道协程是啥?协程其实可以认为是比线程更小的执行单元. 为啥说他是一个执行单元,因为他自带CPU上下文.这样只要在合适的时机, 我们可以把一个协程 切换到另一个协程. 只要这个过程中保存或恢复 CPU上下文那么程序还是可以运行的. Num02–>协程和线程的差异 那么这个过程看起来和线程差不多.其实不然, 线程切换从系统层面远不止保存和恢复 CP

  • PHP中的命名空间相关概念浅析

    1. PHP中的命名空间是什么? 什么是命名空间?"从广义上来说,命名空间是一种封装事物的方法.在很多地方都可以见到这种抽象概念.例如,在操作系统中目录用来将相关文件分组,对于目录中的文件来说,它就扮演了命名空间的角色.具体举个例子,文件 foo.txt 可以同时在目录/home/greg 和 /home/other 中存在,但在同一个目录中不能存在两个 foo.txt 文件.另外,在目录 /home/greg 外访问 foo.txt 文件时,我们必须将目录名以及目录分隔符放在文件名之前得到 /

  • 详解java实践SPI机制及浅析源码

    1.概念 正式步入今天的核心内容之前,溪源先给大家介绍一下关于SPI机制的相关概念,最后会提供实践源代码. SPI即Service Provider Interface,属于JDK内置的一种动态的服务提供发现机制,可以理解为运行时动态加载接口的实现类.更甚至,大家可以将SPI机制与设计模式中的策略模式建立联系. SPI机制: 从上图中理解SPI机制:标准化接口+策略模式+配置文件: SPI机制核心思想:系统设计的各个抽象,往往有很多不同的实现方案,在面向的对象的设计里,一般推荐模块之间基于接口编

  • 浅析Android Studio 3.0 升级各种坑(推荐)

    点击 Check for Updates 增量更新: 下载完成,会提示更新 您将 Gradle 更新至 4.1: 这里建议您对老项目先暂时点击 Don't remind me on this project,以防有坑.当然我不入地狱谁入地狱,我点 Update,于是问题来了,一直处于下载中,不过,莫担心,我下载好了,公众号聊天界面回复「 gradle-4.1-all 」,下载 gradle-4.1-all.zip 文件,放到: 重启 Android Studio. gradle 目录: Mac系

  • Prototype源码浅析 String部分(四)之补充

    替换 interpolate  | sub |  scan |  truncate | gsubinterpolate : 将字符串看作一个模板,并使用 object 的属性填充它. sub : 将字符串中前指定个个与 pattern 指定的模式匹配的子串用 replacement 替换 scan : 遍历字符串中与参数 pattern 指定的模式匹配的所有子串.返回原始字符串本身. truncate : 将字符串截短为指定的长度(包含后缀部分), 并添加一个后缀. gsub :将字符串中所有与

  • Prototype源码浅析 String部分(二)

    格式 camelize | capitalize |  underscore |  dasherize  | inspect           变形 toArray |  succ  | times这里面一个有用的方法是inspect,按照参考手册的说明,他的作用是"返回该字符串针对调试的字符串表现形式(即用单引号或双引号包括起来,并使用 '\' 对特殊字符进行转义)",在Object的toJSON里面也涉及到这个方法. 既然涉及到需要转义的字符,我们自然要一份转义字符信息,下面直接

  • 浅析angularJS中的ui-router和ng-grid模块

    在家里闲着无聊,正好在网上找到了一个关于angular的教程,学习了一下angular的ui-router和ng-grid这两个模块,顺便模仿着做了一个小小的东西. 代码已经上传到github上,地址在这里哟https://github.com/wwervin72/Angular. 有兴趣的小伙伴可以看看.那么然后这里我们就先来了解一下这两个模块的用法. 我们先来说说ui-router这个模块,这个模块主要是用来实现深层次的路由的.其实angular有个内置的指令ng-route,如果在项目中没

  • .NET下文本相似度算法余弦定理和SimHash浅析及应用实例分析

    本文实例讲述了.NET下文本相似度算法余弦定理和SimHash浅析及应用.分享给大家供大家参考.具体分析如下: 余弦相似性 原理:首先我们先把两段文本分词,列出来所有单词,其次我们计算每个词语的词频,最后把词语转换为向量,这样我们就只需要计算两个向量的相似程度.   我们简单表述如下   文本1:我/爱/北京/天安门/ 经过分词求词频得出向量(伪向量)  [1,1,1,1]   文本2:我们/都爱/北京/天安门/ 经过分词求词频得出向量(伪向量)  [1,0,1,2]   我们可以把它们想象成空

随机推荐