【构造函数】.doc_第1页
【构造函数】.doc_第2页
【构造函数】.doc_第3页
【构造函数】.doc_第4页
【构造函数】.doc_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

构造函数 是一种特殊的方法 主要用来在创建对象时初始化对象 即为对象成员变量赋初始值,总与new运算符一起使用在创建对象的语句中 特别的一个类可以有多个构造函数 可根据其参数个数的不同或参数类型的不同来区分它们 即构造函数的重载构造函数与其他方法的区别1.构造函数的命名必须和类名完全相同;在java中普通函数可以和构造函数同名,但是必须带有返回值。 2.构造函数的功能主要用于在类的对象创建时定义初始化的状态.它没有返回值,也不能用void来修饰.这就保证了它不仅什么也不用自动返回,而且根本不能有任何选择.而其他方法都有返回值.即使是void返回值,尽管方法体本身不会自动返回什么,但仍然可以让它返回一些东西,而这些东西可能是不安全的. 3.构造函数不能被直接调用,必须通过new运算符在创建对象时才会自动调用;而一般的方法是在程序执行到它的时候被调用的. 4.当定义一个类的时候,通常情况下都会显示该类的构造函数,并在函数中指定初始化的工作也可省略,不过Java编译器会提供一个默认的构造函数.此默认构造函数是不带参数的.而一般的方法不存在这一特点 5当一个类只定义了私有的构造函数,将无法通过new关键字来创建其对象,当一个类没有定义任何构造函数,C#编译器会为其自动生成一个默认的无参的构造函数。 C+中的构造函数C+语言为类提供的构造函数可自动完成对象的初始化任务,全局对象和静态对象的构造函数在main()函数执行之前就被调用,局部静态对象的构造函数是当程序第一次执行到相应语句时才被调用然而给出一个外部对象的引用性声明时,并不调用相应的构造函数,因为这个外部对象只是引用在其他地方声明的对象,并没有真正地创建一个对象 C+的构造函数定义格式为: class public: (参数表) /.(还可以声明其它成员函数) ; :(参数表) /函数体 如以下定义是合法的: class T public: T(int a=0)i=a;/构造函数允许直接写在类定义内,也允许有参数表。 private:int i; ; 如果一个类中没有定义任何的构造函数,那么编译器只有在以下三种情况,才会提供默认的构造函数: 1、如果类有虚拟成员函数或者虚拟继承父类(即有虚拟基类)时; 2、如果类的基类有构造函数(可以是用户定义的构造函数,或编译器提供的默认构造函数); 3、在类中的所有非静态的对象数据成员,它们对应的类中有构造函数(可以是用户定义的构造函数,或 编译器提供的默认构造函数)。 :(),即不执行任何操作。 各语言构造函数例子C+构造函数例子/注意若将本代码直接复制进编译器,可能会报错,原因是网页生成时会在代码前加一个中文占位符 /最好将代码再写一次 #include using namespace std; class time public: time() /constructor.构造函数 hour=0; minute=0; sec=0; void set_time(); void show_time(); private: int hour; int minute; int sec; ; int main() class time t1; t1.show_time(); t1.set_time(); t1.show_time(); return 0; void time:set_time() cin hour; cin minute; cin sec; void time:show_time() couthour:minute:secendl; 程序运行情况: 0:0:0 10 11 11 回车 10:11:11 任何时候,只要创建类或结构,就会调用它的构造函数。类或结构可能有多个接受不同参数的构造函数。构造函数使得程序员可设置默认值、限制实例化以及编写灵活且便于阅读的代码。 PHP构造函数例子构造函数的声明与其它操作的声明一样,只是其名称必须是两个下划线_construct( )。这是PHP5中的变化;PHP4的版本中,构造函数的名称必须与类名相同。为了向下兼容,如果一个类中没有名为_construct( )的方法,PHP将搜索一个与类名相同的方法。 格式:function _construct ( 参数 ) . . 例子: name=lisi; $this-age=28; function say() echo my name is .$this-name.; echo my age is .$this-age.; $per=new person(); $per-say(); $per-name=zhangsan; $per-age=26; $per-say(); ? C#构造函数例子构造函数是在创建给定类型的对象时执行的类方法。构造函数具有与类相同的名称,它通常初始化新对象的数据成员。 在下面的示例中,使用一个简单的构造函数定义了名为 Taxi 的类。然后使用 new 运算符来实例化该类。在为新对象分配内存之后,new 运算符立即调用 Taxi 构造函数。 publicclass Taxi publicbool isInitialized; public Taxi() isInitialized = true; class TestTaxi staticvoid Main() Taxi t = new Taxi(); System.Console.WriteLine(t.isInitialized); JAVA构造函数例子public class UserManagerImpl implements UserManager private UserDao userDao; public UserManagerImpl(UserDao userDao) this.userDao=userDao; public void save(String username,String password) this.userDao.save(username, password); 注意: 由于Java不允许像C+那样为函数的参数提供缺省值, 因此在构造函数中也不能使用缺省值.Q:构造函数还是系统分配空间呢?A:1.分配的时间你定义了一个对象的时候就已经分配了(如果是指针我这里认为已经new了)2.谁在分配?和构造函数无关,构造函数所做的操作主要是对数据的初始化。申明一个新对象,简单讲经过了两部操作,第一步分配空间(new),第二步初始化(调用构造函数),负责分配空间的是C+的运行库,在WINDOWS下最终是调用virtualalloc(你如果想查这个函数可以去查,这个用于虚拟内存分配的).但实际上用new定义一个对象有三部操作(例如string *p=new string())1.分配空间2.在分配的空间上调用构造函数3.将空间地址返回给调用new的指针.随便也就提一些东西,你可以看着玩玩,不要深入,下面的代码class A.void main()A *p;p=new A()if(p!=null)处理p中数据上面的程序甚至是可能出错的,因为代码可能被“优化”,p=new A()可以分解为三步,由于CPU可以根据程序的情况进行乱序操作,所以有可能p先分配空间后并没有调用构造函数就直接返回了地址,这样导致p确实是不为NULL,进而导致后面出错(有相关的CPU指令可以禁止这样)。Q:构造函数与析构函数?A: 构造函数是你在创造了类的一个对象的时候首先运行的函数 可以有参数 可以无参数 也可以重载 你可以发现你在定义类的成员的时候无法赋初始值 构造函数的很重要的一个用处就是初始化里面的成员变量析构函数正好相反 当你这个类的对象不存在的时候 先运行析构函数 然后再释放这个对象所占用的内存 比如说定义在某个函数里的类的对象 当这个函数体结束的时候 先运行这个类的对象的析构函数 然后释放该类所占用的内存 现在析构函数最大的用处就是 比如说你在构造函数里用了 new这个函数 申请了一块堆内存 (或者用malloc 一样的作用)如果你不释放这块内存就会造成内存泄露 这个时候就应该在析构函数里写一个delete函数释放申请的空间(如果是malloc申请的则用free()函数)别的用处就看你自己想象了。另外还有一点应该注意 先构造后析构 比如你申请了类TEMP的两个对象TEMP a;TEMP b;则析构的时候首先析构b,然后再析构a,如果是继承的话 则先构造子类 然后构造父类 先析构父类 后析构子类 你可以自己尝试写点儿句子 可以更加了解构造函数析构函数的顺序及作用。选择题1构造函数的任务是: C A)初始化函数成员 B)为对象分配内存 C)初始化数据成员 D)建立对象2成员函数重载双目运算符时,左操作数是: B A)数值 B)对象 C)该函数的参数 D)类名3当用public继承从基类派生一个类时,基类的public成员成为派生类的什么成员? AA) public B) private C) protected D) virtual*4拷贝构造函数用于哪些方面?ABDA)当函数的形参是类的对象,调用函数时,进行形参与实参结合时使用。 B)当函数的返回值是类对象,函数执行结束返回调用者时使用。 C)当定义对象时使用。D)用类的一个对象去初始化该类的另一个对象时使用。简答题:1解释什么是面向对象程序设计的封装性。答:对象是一个封装体,在其中封装了该对象所具有的属性和操作。对象作为独立的基本单元,实现了将数据和数据处理相结合的思想。此外,封装特性还体现在可以限制对象中数据和操作的访问权限,从而将属性“隐藏”在对象内部,对外只呈现一定的外部特性和功能。 封装性增加了对象的独立性,C+通过建立数据类型类,来支持封装和数据隐藏。一个定义完好的类一旦建立,就可看成完全的封装体,作为一个整体单元使用,用户不需要知道这个类是如何工作的,而只需要知道如何使用就行。另一方面,封装增加了数据的可靠性,保护类中的数据不被类以外的程序随意使用。这两个优点十分有利于程序的调试和维护。 2. 是否使用了虚函数就能实现运行时的多态性?怎样才能实现运行时的多态性?答:不是。实现动态多态性时,必须使用基类类型的指针变量或引用,使该指针指向该基类的不同派生类的对象,并通过该指针指向虚函数,才能实现动态的多态性。3构造函数和析构函数可以继承吗?派生类构造函数各部分的执行次序是怎样的?答:构造函数和析构函数不可以继承。派生类构造函数各部分的执行次序是: 1.调用基类构造函数,按它们在派生类声明的先后顺序,依次调用。 2.调用新增成员对象的构造函数,按它们在

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论