//=====================================================================
//TITLE:
// C++ VS C#(12):函数的重载,类成员的static修饰,属性
//AUTHOR:
// norains
//DATE:
// Monday 04-April-2011
//Environment:
// Visual Studio 2010
// Visual Studio 2005
//=====================================================================
1. 函数的重载
在C++中,对象函数的重载只有一个原则,就是派生类和基类的函数名必须相同,除此以外,并无更多的约束,如:
函数前的virtual只是告诉编译器,当用基类指针指向派生类对象时,调用的应该是派生类的Add函数;而如果没有virtual,那么在相同的情形之下,调用的则是基类本身的Add。但不管有无virtual,编译器都不会作出任何提示或警告。
相对于C++而言,C#在这方面就智能一点。如果基类没有采用virtual关键字,并且派生类也没有采用override,那么编译器会有类似的警告:
warning CS0114: 'Function.CDerived.Add()' hides inherited member 'Function.CBase.Add()'. To make the current member override that implementation, add the override keyword. Otherwise add the new keyword.
不要小看这个不起眼的警告,也许在不少场合能帮上大忙。比如基类是由同事写的,并且其代码需要调用到派生类的某个重载函数,而你也确实重载了;但在随后的工作中,同事觉得这函数名不好看或什么杂七杂八的理由,更改了函数名,那么灾难就发生了,你重载的函数永远无法调用!如果有了这么一个警告,说不定类似的情形还能够避免。
C#对于函数的修饰符,比C++多了三个,其功能列表如下:
修饰符
|
说明
|
virtual
|
方法可以重写
|
abstract
|
方法必须在非抽象类的派生类中重写
|
override
|
重写了基类的一个方法
|
extern
|
方法定义在其它地方
|
2. 类成员的static修饰
如果将static在class中使用,那么C++和C#有个非常明显的区别:在C#里,static修饰过的函数或变量,不能够通过对象来访问,而必须使用类来访问;而在C++中,则无此限制。
我们来看看这个C++代码,注意代码中的注释:
但对于C#来说,情形确实大为不同,如下代码所示:
个人更喜欢C++的方式,因为类本来就是一个抽象的层次,对象是具体化的阶段,类可以访问的话,那么对象也应该可以访问,毕竟static是所有对象所共有的,通过对象不能访问static成员,无论如何也觉得情理不通。
关于static还有一个区别,细心的朋友可能发现了,C++中的static变量声明是无法直接初始化的,而必须在.cpp中进行;至于C#,本来就没有头文件的存在,所以也无所谓外部定义,直接赋值即可。这点上,C#做的更好些。
3. 属性
属性这玩意就没啥差异可说,当然并不是C++和C#是一样的,而是因为C++根本就没这东西,是C#所独有的。因为C++程序员可能对此不明白,所以特意提一下。
所谓的属性,就是采用get和set的代码块,是作用于成员变量的,并且只有当操作符为"="时有作用。估计这样说,谁都会头疼,我们还是来看看实际的代码,如下所示:
以一种不恰当的比喻说明,get和set就像是针对某个变量重载其"="操作符。C#属性的方式,打破了C++的一个信条:成员变量都应该声明为private,对其的存储尽可能使用函数的方式。当然,C#的所谓打破,其实也是形式上的打破,本质上其实也是遵循该信仰:如果直接通过对象来访问成员变量,当其赋值或获取不符合要求,就用get和set改变其行为。对于C++的程序员来说,可能唯一碍眼的仅仅是myObj.iVal这样的形式而已。
分享到:
相关推荐
C++类与对象:static静态数据成员静态成员函数.doc
C_C++函数符号生成规则(函数名的修饰);C++ 函数重载.pdf
c++中通过函数名和函数确定一个函数 所以相同的函数名,不同参数也是可以的 不同于c语言,c语言没有函数重载,函数的本质地址就是函数名 函数重载发生在同一个作用域内 类中的重载 构造函数重载 普通成员函数重载 ...
C++ 线程函数是类的成员函数 C++ 线程函数是类的成员函数
c++之第五函数重载与缺省参数c++之第五函数重载与缺省参数c++之第五函数重载与缺省参数c++之第五函数重载与缺省参数
C++将类的成员函数作为回调函数使用介绍
重载构造函数,调用成员函数,供C++初学者理解构造函数重载的概念
c++ demo,运算符重载,成员函数的实现
C#调用C++DLL,C++DLL中的函数参数包含指针。 绝对可用。
C++函数重载的例子解析,C++函数模板重载
一般地,线程要读写类的私有成员变量,只有两种方法:将全局函数声明为类友元friend,或者使用静态的成员函数static。那非静态的成员函数呢?一般地方都说的是,不行,做不了。。。为什么不行?都是代码区的代码,...
一 函数重载 二函数模板 三类模板 的说明及代表代码
(1)输人并运行所给的参考程1...(4)使用重载函数模板重新实现上小题中的函数Maxl。 (5)使用系统函数pow(x,y)计算xy的值,注意包含头文件math.h。 (6)用递归的方法编写函数求Fibonacci级数,观察递归调用的过程。
c++ 计算圆、长方形、平行四边形面积(应用‘类’‘函数重载’)
C++运算符重载函数作为类成员函数和友元函数.doc
C#直接调用C++的函数,C#调用托管C++,C++托管调用非托管C++
C++考试题目: 题目:建立一个名为Student的类,该类有以下几个私有成员变量:学生姓名、学号、性别、年龄。还有以下两个成员函数:一个用于初始化学生姓名、...编程环境:vs2010,语言:c++ 属性:控制台应用程序。
一个Demo,描述了C#如何在C++中注册函数并回调
解压后是两个项目,一个c++DLL,一个c#控制台。C#调用c++函数的dll文件,同时实现c++调用c#函数,解决了错误,可以正常运行。如果有其他问题,可以互相讨论。
c++类成员函数作为回调函数