`
java-mans
  • 浏览: 11464732 次
文章分类
社区版块
存档分类
最新评论

C++ VS C#(8):类定义

 
阅读更多

//=====================================================================
//TITLE:
// C++ VS C#(8):类定义
//AUTHOR:
// norains
//DATE:
// Thursday 17-January-2011
//Environment:
// Visual Studio 2010
// Visual Studio 2005
//=====================================================================

1. 类定义

C++和C#都具备面向对象的特性,自然而然,两者都有类这个玩意。无论是C++,或是C#,定义类的关键字都是class。也就是说,这两种语言都可以这样声明一个类:


至此,C++的声明就是如此了。但C#还在此基础上再度发展,在class之前还有internal和public两个关键字可选。默认的情况下,类声明是内部的,只有当前项目的代码才能访问它,换句话来说,上面的声明在C#中相当于如此:


如果想在别的项目中也能使用该代码,那么必须用public来进行修饰,如:


除了这两个访问修饰以外,还能指定类是否是抽象的,或密封的。抽象的关键字是abstract,表明其不能实例化,只能继承;密封的关键字是sealed,表示其不能被继承。从意思上我们就可以知道,这两个关键字是互斥的,两者只能选择其一。

如果我们声明一个抽象的公共类,代码可以书写如下:


public和abstract这两个关键字的次序无关紧要,可以随意颠倒。

我们来讨论一个很有意思的问题,C++没有这两个关键字,是不是就没办法实现类似于C#的功能了呢?答案当然不是了。我们来看看,如何用C++来实现C#的这两个特性。

首先来看的是密封,也就是不能让这个类被继承。虽然C++没有sealed关键字,但实现这个功能一点也不费功夫,我们只要将构造函数或析构函数声明为private即可,如下代码所示:


当CMyClass继承于CmyBase,并且声明一个CmyClass对象时,那么编译器就会报如下错误:
error C2248: 'CMyBase::CMyBase' : cannot access private member declared in class 'CMyBase'
error C2248: 'CMyBase::~CMyBase' : cannot access private member declared in class 'CMyBase'

通过将构造函数和析构函数声明为private的方式,就达到了让类无法被继承的目的。

接着来看看抽象,也就是类不能实例化,只能进行继承。这个C++也能够实现,但却并不是很完美。我们都知道,C++的类什么情况下不能实例化?就是类中带有纯虚函数的时候。借助这个特性,我们也能实现类不能实例化的目的,如下代码所示:


虽然我们通过了纯虚函数实现了类不能实例化的目的,但同时却也带出了纯虚函数这个累赘,令子类为了实例化不得不实现这个没有任何意义的纯虚函数。相对而言,在这个方面,C#确实比C++要简便很多。

分享到:
评论

相关推荐

    C++结构体/函数定义转换C#函数定义/结构体

    把c++的结构体、数据类型、函数定义转换成对应的c#表达,很强大。

    C#【必备技能篇】VS2019 使用C/C++ 生成DLL 文件,并用 C/C++、C#调用DLL

    在C#开发软件的过程中,要经常调用C/C++生成的dll,本文主要介绍用C/C++生成dll的步骤,以及用C/C++、C#两种语言实现dll的引用实现。本文使用的IDE是VS2019,文章通过具体实例进行讲解,大家可以跟着自己动手进行...

    通过C++的类比较来学习C#的类的使用

    在 C#中,类的定义方式和C++中基本一致,但是在调用的类的时候,必须注意C#中的类属 于引用类型的变量。当定义一个类的变量之后,必须要先用new 对该引用实例化,然后才 可以进行初始化等工作。所以用惯了C++的...

    如何用C#使用C++编写的类

    如何用C#使用C++编写的类,介绍适用C#调用C++类的方法

    C#调用C++动态库中自身定义的回调函数

    VS2017环境中,C#程序动态调用C++库中函数,并触发调用自身定义的回调函数

    C#调用C++接口示例

    因此需要一种间接的做法,简单来说就是C#定义一个创建空字符串的接口,传递这个接口指针给C++模块,然后在C++模块中调用这个C#接口创建一个空的字符串接口。然后在传递字符串时先调用这个C#接口创建一个空字符串,...

    C++的结构转为C#结构

    C++的定义的结构,在很多情况下不能直接以C#中使用.特别中逐字节操作的结构.(如通讯数据包),本工具把C++的struct转化为等价的C#形式,为双方通讯协议打下基础.

    C、C#、C++、Java 中定义以为数组的方式

    C、C#、C++、Java 中定义以为数组的方式 C、C#、C++、Java 中定义以为数组的方式 C、C#、C++、Java 中定义以为数组的方式

    【CLRInsideOut】C#调用C++DLL结构体或函数声明代码生成工具

    因项目需要,要用C#程序调用C++的一个DLL库,了解到有个工具叫CLRInsideOut,其中一个的功能就是把C++下的结构体或者函数声明转换成C#下的定义,自动生成 C# 代码。 现上传上来,方便大家编码,给有需要的人,个人...

    C++中实现委托(delegate)

    网上有很多关于C++ delegate机制的文章,但都讲的是函数指针的内容,上周就C++中实现C#的delegate机制的问题研究了好几天,查看了很多相关资料,才解决了问题,现将我写的C++ delegate测试程序贴出来,希望能帮到有...

    C#调用C和C++动态库参数自动转换工具.rar

    C# 再调用C或C++ 动态库的时候,总是被生成正确的C函数在C#中的正确声明而困扰,而生成C++中结构体在C#中的声明

    C#使用List类实现动态变长数组的方法

    本文实例讲述了C#使用List类实现动态变长数组的方法。分享给大家供大家参考。具体如下: C#中的list可以当做数组使用,而且无需定义长度,完全是动态的 class Person { public string Name { get; set; } public ...

    c#(.net)调用c++dll[x86与x64]

    c#项目用visual studio2013(debug是加载x86的dll,release加载的是x64的dll)在项目属性里修改编译环境 win32dll项目用visual studio2015,代码有宏定义还有注释,很全面

    C#的COM事件在C++和JAVA中触发和响应的实现

    C#的COM事件在C++和JAVA中触发和响应的实现 C#中定义COM的事件,在C++或者JAVA中去实现事件,并由其执行相应的函数后触发COM内部的逻辑,然后响应事件。

    C# C++ enum 枚举 例子.rar

    即Sun=0,Mon=1,Tue=2,Wed=3,Thu=4,Fri=5,Sat=6 也可以自己定义数值,其后值总是前面一个+1 例如: enum day {Sun=7,Mon=1,Tue,Wed,Thu,Fri,Sat}d1,d2,d3; 给枚举量赋值 d1=Sun; d2=Mon; d3=Sat; //不可以直接赋予...

    C#继承多态 某公司雇员(Employee)包括经理(Manager),技术人员(Technician)和销售员(Salesman)

    某公司雇员(Employee)包括经理(Manager),技术人员(Technician)和销售员(Salesman)。开发部经理(DeveloperManger),既是经理也是技术人员。...特别注意pay()的定义和调用方法:先用同名覆盖,再用运行时多态。

    c#语言定义

    微软c#语言定义主要是从C和C++继承而来的,而且语言中的许多元素也反映了这一点。C#在设计者从C++继承的可选选项方面比Java要广泛一些(比如说structs),它还增加了自己新的特点(比方说源代码版本定义).但它还太不...

    在一小时内学会 C#(txt版本)

    例如:long 在 C++ 中是 4 字节而在 C# 中是 8 字节。bool 和 string 类型均和 C++ 不同。bool 仅接受真、假而非任意整数。 用户定义类型文件包含: 1. 类 (class) 2. 结构(struct) 3. 接口(interface) ...

    C# 语言规范 版本5.0中文.pdf

    此外, C# 同时支持用户定义的引用类型和值类型,既允许对象 的动态分配,也允许轻量结构的内联存储。 为了确保 C# 程序和库能够以兼容的方式逐步演进, C# 的设计中充分强调了版本控制 (versioning)。许 多编程语言...

Global site tag (gtag.js) - Google Analytics