深入类的初始化和方法重载
上一篇 /
下一篇 2012-11-28 09:46:40
/ 个人分类:C++
51Testing软件测试网0Cg(A"^2W:ql 类为什么要初始化,这要追溯到程序员经常不太注意的一个问题,就是忘记初始化变量,尤其是C程序员。常常会因为某个变量未被初始化而引发不可预知的错误。51Testing软件测试网i+VE+U!jo8a o
51Testing软件测试网6xrma U+R 当然,C语言中不涉及到类的概念,但是,在C++和Java中,引入了构造器这种概念来解决这个问题。构造器就是用来做初始化的工作的,如果程序员忘记在建类的时候加上构造器,则编译器会自动创建构造器。为了调用 方便,采用与类名相同的名称来定义默认构造器的名称。有了默认构造器,就保证了我们在调用方法之前,它已经被初始化了。
f&eY;efT o09a]bRVD0 在实际的开发中,为了让程序员按自己的需求来创建类的实例对象,采用重载构造方法,来定制不同的实例对象。程序员可以根据实际情况,创建不同的构造器,这样,在使用类之前,可以用不同的参数来新建对象,在这里,就用到了刚刚提到的方法重载功能。
Kz\m|+v+Ce0Q!JT,ms(Kj0 方法重载:通
俗来讲就是,在同一个类中,两个方法名称相同,参数不同(此处参数的不同,包括参数的个数不同,或者是参数的类型不同,甚至是参数的顺序不同)。此处有一
个容易让人产生幻觉的地方,就是,是不是可以以两个方法的返回值不同来区分方法重载?不可否认,我以前也这样怀疑过,找了资料,大家说什么的都有,后来,
自己亲自做了实验,写了一小段代码测试就
出来了,结果是:不可以,返回值的不同是不能用来区分方法重载的。因为从理论上讲,我们设想一下,实际情况中,总是方法调用在前,返回值在后,如果有两个
方法,只有返回值不同,那么编译器在调用它们的时候,是看不出它们有什么不同的(只有在方法执行完后才知道),因此只能把它们当做是相同的方法,因此肯定
是通不过的。所以说,实验很重要,建议大家在写程序的时候,如果遇到模棱两个的东西,一定要动手做实验,这样才能获得正确的知识。51Testing软件测试网LM-^p_
51Testing软件测试网A;T*n-sE i_oi sL 方法覆写:与
方法重载来做区分的另一个技术就是方法覆写,覆写是指,在两个类中(一般是指继承过程中的基类和派生类),方法名相同,参数也相同的两个类(注意区分和重
载不同的地方)。这样多数用在继承中,父类通过提供接口,子类覆写这个接口,用来实现不同的功能,也就是C++里面多态的实现原理,当然多态的内部细节比
较复杂。
'e amb`%t0yJ.L#ViT!t
Y[x@0 方法隐藏:是与方法覆写来区分的,还是两个类,如果方法名相同,参数相同,且基类无virtual关键字,就实现了方法隐藏,派生类屏蔽了基类的函数51Testing软件测试网zk)~T!pwe
;| A;n @6P$w-z0 总结一下:51Testing软件测试网[bQRu*y
51Testing软件测试网:X4U]%[.{o Java中:
!g5]-@9qk%F051Testing软件测试网e*v[)Hg;B^ 重载:是在同一个类中,两个方法名称相同,参数不同51Testing软件测试网8b9Tzhej+? v|+K
$i]tH4L-h+\0Q0 覆写是:在两个类中,方法名相同,参数也相同的两个类
5q:\0V+J9w*M-s051Testing软件测试网_kF:{Wa
T-TX
@ C++中:
3o"? R
sEp-{051Testing软件测试网tmn
Sw/q*{_W 重载:是在同一个类中,两个方法名称相同,参数不同
Ds b,^g?&B@p0Ux'p03I3}5J-S.S/c o0 覆写是:在两个类中,方法名相同,参数也相同的两个类,且基类函数必须有virtual关键字,若无virtual关键字,则为隐藏。51Testing软件测试网R6h&ub%ga9ot"w(E0A
KptF+c/Bo~0 隐藏是指:如果方法名相同,参数不同,不论基类有无virtual关键字,最后都实现了方法隐藏。
4vg#\whk!`,{)|0!^ x6Iq&w,m7R]0
(如果派生类的函数与基类的函数同名,但是参数不同。此时,若基类无virtual关键字,则肯定是隐藏。但是如果派生类的函数与基类的函数同名,但是
参数不同。此时,若基类有virtual关键字,基类的函数将被隐式继承到派生类的vtable中。此时派生类vtable中的函数指向基类版本的函数地
址。同时这个新的函数版本添加到派生类中,作为派生类的重载版本。但在基类指针实现多态调用函数方法时,这个新的派生类函数版本将会被隐藏)
pbS|(qU:@h051Testing软件测试网VD'm5Wmo 如果方法名相同,参数相同,且基类无virtual关键字,就实现了方法隐藏。
CZ }"K8d051Testing软件测试网3KX/C
za 貌似很复杂,我们一定要理清啊!
4Med.sq0
收藏
举报
TAG: