构造函数的前世今生

其实当我们在谈论一个新名词、一个新概念或一个新思想时,我们更应该先思考一下这个新产生的事物是从哪里产生的?是为了解决什么问题而提出来的?或者说没有这个思想,原来的旧事物哪里不方便了?

好,废话不多说 ,我们就用这个方法来解决题目所提出的新名词——构造函数

构造函数是从哪里提出来的?

答:这一概念是来自于程序设计语言中面向对象这一思想,构造类时提出的,是由类引出的。在类实例化时,为每个对象都创建了一个默认的初始化方法,这个方法被称为构造函数。

现在我们娓娓道来它的前世今生。

在面向对象这一思想提出后,最吸引人的概念就是抽象类了。我们通过千辛万苦,过五关斩六将的毅力设计出一个类来,然后我们就可以肆意妄为的实例化对象,这让很多单身程序猿狠狠地爽了一把,因为他们可以new出任意多的对象,然后……嘿嘿嘿。Java程序语言更是将面向对象——这一思想,发挥的淋漓尽致,在这里我们不谈具体的语言,思考问题的方式才是关键,有道无术,术尚可求,有术无道,止于术。所以构造函数本身并不具吸引力,让我们疯狂的是大师们如何提出这一思想的。还回到类这一主题,设计类最初的目的就是为了表示数据,使数据更加符合人的思维模式-----将数据隐藏而用其成员方法访问其内部成员变量。类一般包括两个部分:成员变量和成员函数(成员方法),为了得到这一原本的目的,我们在设计类时,通常的做法是把成员变量设成私有,而把成员方法设成公开。这样我们大家可以通过实例化对象,然后用其成员方法来操纵其成员属性,这一种方式很好地体现了保护作用的特点——将数据隐藏。说了这么多,可与构造函数并没有半毛钱的关系啊!不要急,该他出场时它自然出场,不是不到,史记未到。当我们废了九牛二虎的力气终于将一个类设计出来时,问题来了,怎么赋值呢?你可能会自然地想到像下面这样的赋值(初始化)方式:

class Person {
    int id;
    string name;
}
Person girl = {123, "LostArt"};

但,我现在告诉你,这样是肯定不可行的,或者说是暂时还不可行的。那为什么呢?很明显,如果数据是公有的,就可以这样了,但问题是:数据不是共有的。如果数据是公有的,这明显违背了类的一个主要初衷——数据隐藏。好好的一个girl ,你竟然让大家看到了她里面的构造(结构),这是万万使不得的呀!那该如何是好呢?最简单的办法就是你自己在你设计好的类里面,再多添加一个赋值的方法,让大家通过这个方法来初始化。不管是谁,在最开始用这个人类时,必须先调用这个赋值方法。现在用符合人的思维想一下,既然在类设计成时,如果实例化,都要先调用这个方法,那为什么不在设计这个面向对象语言开始时,事先让编译器自动的为你定义的类赋值呢?或者说你懒得自己调用自己的这个赋值方法了,因为这是一个很麻烦的事情,让程序默认为你赋值。好了,说到这里,时机已成熟,构造函数这一概念已经呼之欲出了。大师们为了表示这个赋值函数很特别,就特别地为这个特别的函数起了一个特别的名字——构造函数,而且大师们还给了它一些特殊的性质:

  • 函数名必须与类名相同。
  • 函数没有返回类型,也不能定义为void,在方法名前面不声明方法类型。
  • 函数的主要作用是完成对象的初始化工作,它能够把定义对象时的参数传给对象的域。

转载于:https://my.oschina.net/hpuwxy/blog/1503164

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值