构造函数:
C++为设计了构造函数机制,它可以达到自动初始化数据成员的目的。
类的构造函数是类的一个特殊成员函数,它没有返回类型(void也不行),可以有参数,函数名和类名一样。
当创建类的一个新对象时,自动调用构造函数,完成初始化工作,需要注意构造函数是否有参数,以及参数的个数、类型。
构造函数的作用:
(1)分配一个对象的数据成员的存储空间(该功能由系统自动完成)。
(2)执行构造函数(体),一般是初始化一个对象的部分或全体数据成员。
若希望该类所有对象初始化值相同,构造函数可以不使用参数;若希望该类所有对象的初始值不相同,通过使用带参数的构造函数可以做到这一点。
构造函数的初始化(构造函数有两种方式初始化数据成员):
(1)在构造函数体内用赋值语句的方式。
(2)用构造函数的初始化列表的方式。
初始化列表:
构造函数名(参数列表)[ :成员名(表达式)[, 成员名(表达式)......] ]
初始化列表的 执行先于构造函数体的执行。并且,一些特殊成员,比如常量成员和引用成员,都必须在初始化列表中进行初始化。
缺省的构造函数:
用户自定义的类类型中,可以没有构造函数。此时编译器会自动给该类类型生成一个没有参数的构造函数,该函数不做任何工作。这种构造函数称为缺省的构造函数。
当建立一个对象时,这个缺省的构造函数被自动调用,不过,一旦一个类有一个显式定义的构造函数,哪怕这个函数是个空函数,编译器也不会代劳生成缺省构造函数了。
但是,一个类类型如果有const成员或引用成员,就不能使用缺省的构造函数。必须使用用户定义的构造函数进行初始化;而且只能使用表达式表的方式进行初始化。
定义类对象时给构造函数提供参数:
创建对象时,需要自动调用构造函数。如果构造函数有参数,那么,创建对象时必须给出对应的构造函数的实参。
有两种方式:
(1)仅仅只有一个参数:
类名 对象名 = 参数;
(2)有一个或多个参数
类名 对象名(参数列表);
重载构造函数:
构造函数的重载,它们的参数表必须互不相同。
析构函数:
析构函数没有返回类型,没有参数,函数名是类名前加"~"。
析构函数的作用:
(1)执行析构函数。(一般没有具体的工作)。
(2)释放对象的存储空间。(该功能由系统自动完成)。
(3)释放对象占用的资源。(这项工作要有程序员设定)。
可以使用完全限定名方式显式地调用析构函数;若没有显式调用,则在一个对象的作用域结束时,系统自动调用析构函数。
系统自动调用构造函数和自动调用析构函数的顺序是相反的。
用户定义的类类型中,可以没有析构函数,系统会自动给该类类型生成一个析构函数。该析构函数不作任何事情。
拷贝构造函数:
什么是拷贝构造函数?
构造函数 的参数可以是任何类型参数,甚至可以将自己类对象的(常量)引用作为参数,称它为拷贝构造函数。
拷贝构造函数有两个含义:
首先,它是一个构造函数,当创建一个新对象时,系统自动调用它;
其次,它将一个已经定义过的对象(参数代表的对象)的数据成员逐一对应地复制给新对象。
如果一个类没有显式定义拷贝构造函数,C++编译器可以为该类产生一个缺省的拷贝构造函数。这个缺省的拷贝构造函数采用C的方式,将拷贝对象的内存一个字节一个字节地拷贝到被拷贝对象的内存当中。这样一来,两个对象的内存映像是一模一样的。
拷贝函数的作用:
(1)创建一个新对象,并将一个已存在的对象拷贝到这个新对象。
(2)对象的值做参数。(将实参对象拷贝给形参对象)。
(3)函数返回一个对象。(拷贝返回的对象是一个临时对象)。
为什么需要拷贝构造函数?
我们往往会忽略为一个类显式地提供拷贝构造函数。此时C++编译器会为这个类产生一个缺省的拷贝构造函数。缺省的拷贝构造函数采用内存拷贝的形式,将已存在对象的内存一个字节一个字节地拷贝到新建对象的内存当中。这样一来,新对象和老对象的内存映像是一模一样的,我们可以说,新对象是老对象的“克隆体”。
对象的创建、释放和初始化:
1.对象的创建和释放
(1)命名的自动对象
每次进入该对象的作用域,都需要调用构造函数;每次退出该对象的作用域,都需要调用析构函数。
(2)自由对象(动态对象)
使用new创建对象(实际上调用构造函数),使用delete释放对象(实际上调用析构函数);当用delete释放对象后,该对象就不能再被使用,另外,如果构造函数有参数,也必须给出实参。
C++没有自动垃圾回收机制。
“内存泄露”。
2.对象的初始化:
表达式表的方法
在C++中,类的对象的数据成员的初始化一般通过构造函数进行。若构造函数有参数,则在创建对象时,必须给出实参(即对象的初始值),方法为:
Class_Name Object(...);
Class_Name Object = ...;
对象和指针
1.this指针
C++为所有的非静态成员函数提供了一个称为this的指针,因此,常常。。。。。(未完)