c++入门对象的初始化、复制和析构_第1页
c++入门对象的初始化、复制和析构_第2页
c++入门对象的初始化、复制和析构_第3页
c++入门对象的初始化、复制和析构_第4页
c++入门对象的初始化、复制和析构_第5页
已阅读5页,还剩28页未读 继续免费阅读

下载本文档

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

文档简介

1、重庆邮电大学计算机科学与技术学院 冯 潇 ,对象的初始化和清理,2020/7/12,主要内容,构造函数的作用、定义、调用时机(很重要) 带参构造函数 默认构造函数(无参数) 复制构造函数的作用、定义、调用时机(重要) 析构函数的作用、定义、调用时机(重要) 对象和对象引用作为函数参数、返回值的效率问题(难点),通过程序回顾,#include using namespace std; class Circle public: void setRadius(double r = 1); double getRadius() const; double getArea() const; privat

2、e: double radius; double pi; ; inline void Circle:setRadius(double r) radius = r 0 ? r : 1; pi = 3.1415926; ,2020/7/12,inline double Circle:getRadius() const return radius; inline double Circle:getArea() const return pi * radius * radius; int main() Circle c; c.setRadius(2.5); cout area = c.getArea(

3、) endl; return 0; ,2020/7/12,通常情况下,数据成员应封装为私有成员,绝大部分成员函数应封装为公有成员 私有成员一般仅能被该类的成员函数操纵,因此,从软件工程实践角度讲,应设置一组get和set方法用于读取和修改数据成员 类的声明提倡以行为为中心,将公有成员放在前面 类的命名采用驼峰匹配原则,即每个名词的首字母大写,如:AdressBook 成员函数名多采用动宾结构,动词小写,名词首字母大写,如:setClassName(),回顾-设计类的基本原则,2020/7/12,回顾-成员函数的调用,即使成员函数的函数体被完整定义出来,程序也不会自动执行它,必须显式调用该成员函

4、数,其格式为: 对象名成员函数名(参数列表) 对象指针 - 成员函数名(参数列表) (*对象指针) 成员函数名(参数列表),2020/7/12,调试模式下观察对象的内部状态,成员函数setRadius()即将开始执行,2020/7/12,观察程序可知,当程序执行到setRadius()被调用前,对象c的数据成员radius和pi的内存仍然是随机值(garbage) 从软件工程角度讲,应在成员函数调用前,将对象完全建立起来既创建对象的内存,还要正确初始化对象,2020/7/12,对象的初始化,对象在定义的时候对其数据成员进行初始化,称为对象的初始化 C+中对象的初始化由一个特殊的成员函数(构造函

5、数)完成 其主要功能是创建并初始化对象 如果用户不自己定义构造函数,则编译器会自动生成一个默认的构造函数。,2020/7/12,构造函数,定义格式: : () 构造函数名与类名相同,且不指定函数返回值 一般情况下,应该构造函数定义为公有成员 编译系统自动生成的默认构造参数其形式为: : ( ) ,Circle类的构造函数,inline void Circle:setRadius(double r) radius = r 0 ? r : 1; pi = 3.1415926; Circle:Circle(double r) cout constructor. endl; setRadius(r);

6、 int main() Circle c(2.5); /等价于Circle c = 2.5; cout area = c.getArea() endl; return 0; /能否找到调用构造函数的语句?采用断点查看构造函数于何时运行 /构造函数能否定义为私有成员?,2020/7/12,说明,构造函数不能并且不需要指定函数返回值 对于局部对象c来说,当程序执行到对象的定义语句“Circle c(2.5);”时,由编译器秘密调用构造函数完成对象的初始化 构造函数一般定义为公有成员,否则编译器无法成功调用构造函数完成对象初始化 设计模式中,往往通过将构造函数设置为私有成员实现“单件(sigleto

7、n)”模式 思考: 全局对象和静态对象的构造函数于何时、何处调用,2020/7/12,思考,用同类对象完成初始化,C+帮我们做了什么 Circle c(2.5); Circle c1 = c; cout area = c1.getArea() endl;,2020/7/12,复制构造函数,主要功能 : 用一个已知的对象来初始化一个同类对象 具体声明格式: : (const pi = 3.1415926; Circle:Circle(const Circle /采用断点查看复制构造函数于何时运行,2020/7/12,对象的清理工作,对象的清理工作由析构函数完成 主要功能: 在对象生存周期即将结束

8、的时刻,由编译系统自动调用来完成一些清理工作 在程序块执行完最后一条语句后,系统自动调用析构函数 语法格式为: : () ,Circle类的析构函数,class Circle public: Circle(double r = 1); Circle(const Circle ,2020/7/12,几点说明,析构函数与类同名,无参数,无需指定返回值 析构函数不能有参数,因此不能重载 析构函数不能回收对象本身所占空间 析构函数的调用顺序和构造函数的调用顺序相反,2020/7/12,思考(难点),class Circle public: Circle(double r = 1); Circle(co

9、nst Circle ,2020/7/12,void draw(Circle cir) cout 进入draw()! endl; cout 这是一个圆! endl; cout draw()执行即将结束! endl; void draw(const Circle ,有何区别?,2020/7/12,分析运行结果,在将对象作为实参传递给形参时,如果形参是对象,则会调用复制构造函数完成对象间的复制,函数调用完毕时,系统调用形参的析构函数 而引用传递的仅仅是地址,不会发生对象复制,2020/7/12,实现一个简单的账户管理程序。要求具有存钱、取钱和查询帐户余额的功能。程序应该给出一个简单的菜单界面,便于

10、用户操作: 1-存钱 2-取钱 3-余额查询,发现对象,2020/7/12,Account类设计1,class Account public: Account(const char *pid, const char *pname, const char *ppwd, double b); bool debit(double amount); /withdraw bool credit(double amount);/deposite void print() const; private: char id17; char name20; char pwd7; double balance; ;

11、,2020/7/12,Account类设计2,class Account public: Account(const char *pid, const char *pname, const char *ppwd,double b); bool debit(double amount); /withdraw bool credit(double amount);/deposite void print() const; private: string id; string name; string pwd; double balance; ;,2020/7/12,#include #includ

12、e #include Account.h using namespace std; bool Account:credit(double amount)/deposite if(amount = 0) cerr 存入金额应大于0! endl; return false; balance += amount; return true; ,帐户类成员函数的类外实现,2020/7/12,bool Account:debit(double amount) /withdraw if (amount balance) cerr 余额不足! endl; return false; /取钱失败! balanc

13、e -= amount; print(); return true; ,debit()的类外实现,2020/7/12,void Account:print() const cout - endl; cout left setw(20) 账号: right setw(20) id endl; cout left setw(20) 户名: right setw(20) name endl; cout left setw(20) 余额: right setw(20) balance endl; ,print()函数的类外实现,2020/7/12,Account:Account(const char

14、*pid,const char *pname,const char *ppwd,double b) strcpy(id,pid); strcpy(name,pname); strcpy(pwd,ppwd); balance = (b = 0) ? b : 0; ,构造函数的实现-char,2020/7/12,Account:Account(const char *pid,const char *pname,const char *ppwd,double b) :id(pid),name(pname),pwd(ppwd) balance = (b = 0) ? b : 0; ,构造函数的实现-string,课外思考1,class Circle public: Circle(double r = 1); void setRadius(double r = 1) double getRadius() const; double getArea() const; private: double radius; double pi; ; int main()

温馨提示

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

评论

0/150

提交评论