构造函数和析构函数 第 0章
2021/2/24 1 第 10章 构造函数和析构函数
构造函数 回顾变量和函数参数的初始化。 变量定义与赋值结合起来: int number=9902 函数应用缺省参数: void add (int a=0, int b=0) 目的便于编程、保证变量的值不会无意义, 减小程序出错的可能性。 2021/224
2021/2/24 2 构造函数 回顾变量和函数参数的初始化。 变量 定义与赋值结合起来: int number=9902; 函数 应用缺省参数: void add(int a=0,int b=0); 目的 便于编程、保证变量的值不会无意义, 减小程序出错的可能性
对象的数据成员进行初始化的三种方法: 1使用初始化数据列表的方法; 2通过构造函数实现初始化; 3通过对象的拷贝初始化函数。 例1:使用初始化数据列表的方法对新产生的对象初 始化。 执行后输出: 25张 7789956 此方法只能对类的公有数据成员初始化,而不 能对私有的或保护的数据成员进行初始化。通常 用构造函数来实现初始化。 2021/224
2021/2/24 3 对象的数据成员进行初始化的三种方法: 1.使用初始化数据列表的方法; 2.通过构造函数实现初始化; 3.通过对象的拷贝初始化函数。 例1:使用初始化数据列表的方法对新产生的对象初 始化。 执行后输出: 101 25 张 三 77.8 99.56 此方法只能对类的公有数据成员初始化,而不 能对私有的或保护的数据成员进行初始化。通常 用构造函数来实现初始化
定义构造函数 构造函数创建并初始化类的数据成员。 类中构造函数的定义类名(参数表) 类外构造函数的定义类名::类名(参数表); 例2:使用构造函数对新产生的对象初始化。 执行后输出: 102 25张三778 99.56 2021/224
2021/2/24 4 定义构造函数 类中构造函数的定义 类名(参数表); 构造函数 创建并初始化类的数据成员。 类外构造函数的定义 类名::类名(参数表); 例2:使用构造函数对新产生的对象初始化。 执行后输出: 102 25 张 三 77.8 99.56
构造函数的特点: 1.与类同名。 2.没有返回值。 3.可以定义多个构造函数。 在创建对象时被自动调用。 5.可以不带参数,也可带若干个参数,还可以指定 参数的缺省值。 6.当定义的类要说明该类的对象时,构造函数是公 有的成员函数;当定义的类仅用于派生其他类时, 可定义为保护的成员函数 2021/224 5
2021/2/24 5 构造函数的特点: 1. 与类同名。 2. 没有返回值。 3. 可以定义多个构造函数。 4. 在创建对象时被自动调用。 5. 可以不带参数,也可带若干个参数,还可以指定 参数的缺省值。 6. 当定义的类要说明该类的对象时,构造函数是公 有的成员函数;当定义的类仅用于派生其他类时, 可定义为保护的成员函数
构造函数应用注意点 1.若自己不定义构造函数,编译程序提供一个缺省构 造函数。 2.若程序用到指针,则应自定义构造函数,以减少程 序出错机会。 3.构造函数和析构函数应成对定义,以养成良好的编 程习惯。 2021/224 6
2021/2/24 6 构造函数应用注意点: 1. 若自己不定义构造函数,编译程序提供一个缺省构 造函数。 2. 若程序用到指针,则应自定义构造函数,以减少程 序出错机会。 3. 构造函数和析构函数应成对定义,以养成良好的编 程习惯
例3:定义一个矩形类的构造函数。 构造函数和对象的初始化 103 构造函数属类的成员函数,故对私有成员 数据、保护的成员数据和公有的成员数据均能 进行初始化。 例4:自动调用构造函数来初始化对象。 执行后输出: 调用带参数的构造函数!104 100200300400 调用不带参数的构造函数! 0000 2021/224
2021/2/24 7 例3:定义一个矩形类的构造函数。 构造函数和对象的初始化 103 构造函数属类的成员函数,故对私有成员 数据、保护的成员数据和公有的成员数据均能 进行初始化。 例4:自动调用构造函数来初始化对象。 104 执行后输出: 调用带参数的构造函数! 100 200 300 400 调用不带参数的构造函数! 0 0 0 0
例5:产生全局对象、静态对象和局部对象。 执行后输出: 105 调用带参数的构造函数(全局)! 进入主函数main( 200300400500 进入函数1( 调用带参数的构造函数(静态)! 2002005000 调用带参数的构造函数(局部) 10010000 调用带参数的构造函数(局部)! 10020000 调用不带参数的构造数! 0000 进入函数fl( 2002005000 调用带参数的构造函数(局部)! 10010000 2021/224 8
2021/2/24 8 例5:产生全局对象、静态对象和局部对象。 执行后输出: 105 调用带参数的构造函数(全局)! 进入主函数main( ) 200 300 400 500 进入函数f1( ) 调用带参数的构造函数(静态)! 200 200 500 0 调用带参数的构造函数(局部)! 100 100 0 0 调用带参数的构造函数(局部)! 100 200 0 0 调用不带参数的构造数! 0 0 0 0 进入函数f1( ) 200 200 500 0 调用带参数的构造函数(局部)! 100 100 0 0
构造函数和new运算符 用new可建立对象。此时要自动调用构造函数, 以完成对象的成员数据初始化。 例6:用new运算符建立对象时调用构造函数。 106 执行后输出: 调用构造函数D(int,int)! 5y=10 调用构造函数D()! x=842150451y=-842150451 2021/224 9
2021/2/24 9 构造函数和new运算符 用new可建立对象。此时要自动调用构造函数, 以完成对象的成员数据初始化。 例6:用new运算符建立对象时调用构造函数。 106 执行后输出: 调用构造函数D(int,int)! x=5 y=10 调用构造函数D()! x=-842150451 y=-842150451
缺省的构造函数 定义类时若没有定义类的构造函数,编译器自动 产生一个缺省的构造函数,格式为: 类名:类名(){} 这是一个函数体为空的构造函数,在产生对象时, 调用的该构造函数不做任何事,新产生对象的数据 成员的值是不确定的。 注:1若定义时定义了类的构造函数,则不产生缺省 的构造函数。 2缺省的构造函数只能有一个。 3需要对对象的数据成员进行初始化时,必须定义构 造函数 2021/224 10
2021/2/24 10 缺省的构造函数 定义类时若没有定义类的构造函数,编译器自动 产生一个缺省的构造函数,格式为: 类名::类名(){ } 这是一个函数体为空的构造函数,在产生对象时, 调用的该构造函数不做任何事,新产生对象的数据 成员的值是不确定的。 注:1.若定义时定义了类的构造函数,则不产生缺省 的构造函数。 2.缺省的构造函数只能有一个。 3.需要对对象的数据成员进行初始化时,必须定义构 造函数