16:29:32 第四章对象的初始化与销毁:构造函数与析构函数 本章主要内容: 1.构造函数、拷贝构造函数 重点 2.构造函数的初始化列表 难点 3.析构函数 重点 总体要求 理解构造函数与析构函数的必要性与特殊性,掌握它们的 使用方法
16:29:32 第四章 对象的初始化与销毁:构造函数与析构函数 本章主要内容: 1. 构造函数、拷贝构造函数 —— 重点 2. 构造函数的初始化列表 —— 难点 3. 析构函数 —— 重点 总体要求: 理解构造函数与析构函数的必要性与特殊性,掌握它们的 使用方法
6:29:3 §1对象的初始化 实质是对象中成员变量的初始化,有3种常见方法 1.成员变量全部公有时的初始化 类的成员变量都是公有的,此时对该类对象的初始化可以 与C中对结构体变量的初始化一样 class address t class person public: public long telenum char name [15] char addr [30] int age; address addr. person p1={“张三”,2 8911114,“ Lanzhou University”}}; 缺点: 数据完全外露,没有实现信息隐藏
16:29:32 §1 对象的初始化 1.成员变量全部公有时的初始化 类的成员变量都是公有的,此时对该类对象的初始化可以 与C中对结构体变量的初始化一样 class person{ public: char name[15]; int age; address addr; }; class address{ public: long telenum; char addr[30]; }; person p1={ “张三”,23, {8911114,“LanZhou University”} }; 缺点: 数据完全外露,没有实现信息隐藏 – 实质是对象中成员变量的初始化,有3种常见方法
6:29:3 2.使用公有的成员函数完成对象的初始化 在类中提供公有的成员函数,对象通过调用这样的成员函 数对其内部的成员进行初始化 例:银行帐户类 class account void Account:: Initialize( char sName [32] char *name char *id char siD[20]: float amount float bAlance public: strcpy(sName, name) void Initialze(char * strcpy(sID, id) char *, float fBalance=amount: 缺点: 客户程序员容易忘记调用这样的函数,对象的初始化得 不到保障
16:29:32 2.使用公有的成员函数完成对象的初始化 在类中提供公有的成员函数,对象通过调用这样的成员函 数对其内部的成员进行初始化 例:银行帐户类 class Account{ char sName[32]; char sID[20]; float fBalance; public: void Initialze(char *, char *,float); }; void Account::Initialize( char *name,char *id, float amount ) { strcpy(sName,name); strcpy(sID,id); fBalance=amount; } void main(){ Account acc; acc.Initialize(“张三” , “s9801”,1000); } 缺点: 客户程序员容易忘记调用这样的函数,对象的初始化得 不到保障
6:29:3 3.构造函数( construc tor) 构造函数是类中特殊的成员函数,其函数名与类名相同 创建对象时系统自动调用构造函数 创建对象的两种方法: 定义类类型的变量 用new运算符动态产生对象 无论用那种方法,都会自动调用构造函数 不是由客户程序员人为调用,而是自动调用 把给成员变量赋值的操作写在构造函数中,就能初始化成 员变量:对象一旦被创建,马上调用构造函数,在能对对象 进行其它操作之前,对象的成员变量已有确定的值了 例:.银行帐户类 日期类
16:29:32 3.构造函数(constructor) –构造函数是类中特殊的成员函数,其函数名与类名相同 –创建对象时系统自动调用构造函数 创建对象的两种方法: .定义类类型的变量 .用new运算符动态产生对象 无论用那种方法,都会自动调用构造函数 —— 不是由客户程序员人为调用,而是自动调用 例: .银行帐户类 .日期类 – 把给成员变量赋值的操作写在构造函数中,就能初始化成 员变量:对象一旦被创建,马上调用构造函数,在能对对象 进行其它操作之前,对象的成员变量已有确定的值了
6:29:3 构造函数的必要性与特殊性 函数名与类名相同 在定义和声明时,不能说明构造函数的返回值类型,而且 构造函数根本不返回任何值 个类的构造函数可以有多个:构造函数允许重载,一个 构造函数对应一种创建对象的方法 构造函数可以带有形参,也可以不带形参,创建对象时自 动调用参数类型、数目均能匹配的一个。实参通过在创建 对象时用括号的形式,在括号中传递给形参。若调用的是 不带参的构造函数,则括号可省略。无论带参与否,程序 中都不能通过对象名或对象指针显式调用构造函数 例: Date dt0bj(2004,10,11) Date *pDtob j=new Date(2004, 10, 12) Date dtob jDf t; Date *pDt=new Da te
16:29:32 构造函数的必要性与特殊性 –函数名与类名相同 –在定义和声明时,不能说明构造函数的返回值类型,而且 构造函数根本不返回任何值 –一个类的构造函数可以有多个:构造函数允许重载,一个 构造函数对应一种创建对象的方法 –构造函数可以带有形参,也可以不带形参,创建对象时自 动调用参数类型、数目均能匹配的一个。实参通过在创建 对象时用括号的形式,在括号中传递给形参。若调用的是 不带参的构造函数,则括号可省略。无论带参与否,程序 中都不能通过对象名或对象指针显式调用构造函数 例:Date dtObj(2004,10,11); Date *pDtObj=new Date(2004,10,12); Date dtObjDft; Date *pDt=new Date;