深入类的初始化和方法重载

上一篇 / 下一篇  2012-11-28 09:46:40 / 个人分类:C++

51Testing软件测试网3{3^_Hj2SP7_.i

  类为什么要初始化,这要追溯到程序员经常不太注意的一个问题,就是忘记初始化变量,尤其是C程序员。常常会因为某个变量未被初始化而引发不可预知的错误。

(jw S@)P0

PrQ(Cp/^Y:t*`0  当然,C语言中不涉及到类的概念,但是,在C++和Java中,引入了构造器这种概念来解决这个问题。构造器就是用来做初始化的工作的,如果程序员忘记在建类的时候加上构造器,则编译器会自动创建构造器。为了调用 方便,采用与类名相同的名称来定义默认构造器的名称。有了默认构造器,就保证了我们在调用方法之前,它已经被初始化了。51Testing软件测试网g_cM4x F [z

51Testing软件测试网M9GARp:a3@W _3~v

  在实际的开发中,为了让程序员按自己的需求来创建类的实例对象,采用重载构造方法,来定制不同的实例对象。程序员可以根据实际情况,创建不同的构造器,这样,在使用类之前,可以用不同的参数来新建对象,在这里,就用到了刚刚提到的方法重载功能。51Testing软件测试网Vv@W"~V6~

51Testing软件测试网z$KI:guv:B2]

  方法重载:通 俗来讲就是,在同一个类中,两个方法名称相同,参数不同(此处参数的不同,包括参数的个数不同,或者是参数的类型不同,甚至是参数的顺序不同)。此处有一 个容易让人产生幻觉的地方,就是,是不是可以以两个方法的返回值不同来区分方法重载?不可否认,我以前也这样怀疑过,找了资料,大家说什么的都有,后来, 自己亲自做了实验,写了一小段代码测试就 出来了,结果是:不可以,返回值的不同是不能用来区分方法重载的。因为从理论上讲,我们设想一下,实际情况中,总是方法调用在前,返回值在后,如果有两个 方法,只有返回值不同,那么编译器在调用它们的时候,是看不出它们有什么不同的(只有在方法执行完后才知道),因此只能把它们当做是相同的方法,因此肯定 是通不过的。所以说,实验很重要,建议大家在写程序的时候,如果遇到模棱两个的东西,一定要动手做实验,这样才能获得正确的知识。

/c4M3K.GOn0

KNd!O5JL+P0  方法覆写:与 方法重载来做区分的另一个技术就是方法覆写,覆写是指,在两个类中(一般是指继承过程中的基类和派生类),方法名相同,参数也相同的两个类(注意区分和重 载不同的地方)。这样多数用在继承中,父类通过提供接口,子类覆写这个接口,用来实现不同的功能,也就是C++里面多态的实现原理,当然多态的内部细节比 较复杂。51Testing软件测试网8a#OVyd

51Testing软件测试网@j~3r/tt\:CM

  方法隐藏:是与方法覆写来区分的,还是两个类,如果方法名相同,参数相同,且基类无virtual关键字,就实现了方法隐藏,派生类屏蔽了基类的函数

JG G%g5c |/m1]j({051Testing软件测试网3ldyu5o4zJ.WC-{N

  总结一下:

v*xNd.OngU0

h&WOk:G j0  Java中:51Testing软件测试网#z-z#i!I R+Q2[i

51Testing软件测试网!R#@&ov~0R)B

  重载:是在同一个类中,两个方法名称相同,参数不同51Testing软件测试网lmxk)A4~5zdR)?

Jk#dO;ATK9m0  覆写是:在两个类中,方法名相同,参数也相同的两个类

(t:^#O9k6C6GfXcS|0

Y&LAV;@qC0  C++中:

&@&z1u'D)mr8F[;M0

#P:i*@!z3Zl0  重载:是在同一个类中,两个方法名称相同,参数不同

{7oK6N?] W:j0

U? jT:D.? I ^TP$U0  覆写是:在两个类中,方法名相同,参数也相同的两个类,且基类函数必须有virtual关键字,若无virtual关键字,则为隐藏。51Testing软件测试网G:p1{s0L

o,suBG1\cU0  隐藏是指:如果方法名相同,参数不同,不论基类有无virtual关键字,最后都实现了方法隐藏。

ae_8{,XOabD051Testing软件测试网)QM'f/z[A#_

   (如果派生类的函数与基类的函数同名,但是参数不同。此时,若基类无virtual关键字,则肯定是隐藏。但是如果派生类的函数与基类的函数同名,但是 参数不同。此时,若基类有virtual关键字,基类的函数将被隐式继承到派生类的vtable中。此时派生类vtable中的函数指向基类版本的函数地 址。同时这个新的函数版本添加到派生类中,作为派生类的重载版本。但在基类指针实现多态调用函数方法时,这个新的派生类函数版本将会被隐藏)51Testing软件测试网6QPgM.f`A

51Testing软件测试网H9B/S'm!A!Tj Q

  如果方法名相同,参数相同,且基类无virtual关键字,就实现了方法隐藏。51Testing软件测试网+X3T!i i VKVO U

8Rq;JW0LVUy0  貌似很复杂,我们一定要理清啊!

1D R \v1p%^y7V0

TAG:

 

评分:0

我来说两句

Open Toolbar