c++入门对象的初始化、复制和析构.ppt

上传人:wuy****n92 文档编号:66804170 上传时间:2022-12-21 格式:PPT 页数:33 大小:320.49KB
返回 下载 相关 举报
c++入门对象的初始化、复制和析构.ppt_第1页
第1页 / 共33页
c++入门对象的初始化、复制和析构.ppt_第2页
第2页 / 共33页
点击查看更多>>
资源描述

《c++入门对象的初始化、复制和析构.ppt》由会员分享,可在线阅读,更多相关《c++入门对象的初始化、复制和析构.ppt(33页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、重庆邮电大学计算机科学与技术学院重庆邮电大学计算机科学与技术学院冯冯 潇潇2022/12/2112主要内容主要内容 构造函数的作用、定义、调用时机构造函数的作用、定义、调用时机构造函数的作用、定义、调用时机构造函数的作用、定义、调用时机(很重要很重要很重要很重要)带参构造函数带参构造函数带参构造函数带参构造函数默认构造函数默认构造函数默认构造函数默认构造函数(无参数无参数无参数无参数)复制构造函数的作用、定义、调用时机复制构造函数的作用、定义、调用时机复制构造函数的作用、定义、调用时机复制构造函数的作用、定义、调用时机(重要重要重要重要)析构函数的作用、定义、调用时机析构函数的作用、定义、调用

2、时机析构函数的作用、定义、调用时机析构函数的作用、定义、调用时机(重要重要重要重要)对象和对象引用作为函数参数、返回值的效率对象和对象引用作为函数参数、返回值的效率对象和对象引用作为函数参数、返回值的效率对象和对象引用作为函数参数、返回值的效率问题问题问题问题(难点难点难点难点)2022/12/21通过程序回顾通过程序回顾#include#includeusing namespace std;using namespace std;class Circleclass Circle public:public:void setRadius(double r=1);void setRadius(d

3、ouble r=1);double getRadius()double getRadius()constconst;double getArea()double getArea()constconst;private:private:double radius;double radius;double pi;double pi;inlineinline void Circle:setRadius(double r)void Circle:setRadius(double r)radius=r 0?r:1;radius=r 0?r:1;pi=3.1415926;pi=3.1415926;2022

4、/12/214inline double Circle:getRadius()constinline double Circle:getRadius()const return radius;return radius;inline double Circle:getArea()constinline double Circle:getArea()const return pi*radius*radius;return pi*radius*radius;int main()int main()Circle c;Circle c;c.setRadius(2.5);c.setRadius(2.5)

5、;cout area=c.getArea()endl;cout area=c.getArea()-成员函数名成员函数名成员函数名成员函数名(参数列表参数列表参数列表参数列表)(*(*(*(*对象指针对象指针对象指针对象指针)成员函数名成员函数名成员函数名成员函数名(参数列表参数列表参数列表参数列表)2022/12/217 成员函数成员函数成员函数成员函数setRadius()setRadius()即将开始执行即将开始执行即将开始执行即将开始执行2022/12/218观察程序可知观察程序可知 当程序执行到当程序执行到当程序执行到当程序执行到setRadius()setRadius()被调用前,对

6、象被调用前,对象被调用前,对象被调用前,对象c c的数的数的数的数据成员据成员据成员据成员radiusradius和和和和pipi的内存仍然是随机值的内存仍然是随机值的内存仍然是随机值的内存仍然是随机值(garbage)(garbage)从软件工程角度讲,应在成员函数调用前,将从软件工程角度讲,应在成员函数调用前,将从软件工程角度讲,应在成员函数调用前,将从软件工程角度讲,应在成员函数调用前,将对象完全建立起来对象完全建立起来对象完全建立起来对象完全建立起来既创建对象的内存,还既创建对象的内存,还既创建对象的内存,还既创建对象的内存,还要正确初始化对象要正确初始化对象要正确初始化对象要正确初始

7、化对象2022/12/219对象的初始化对象的初始化 对象在定义的时候对其数据成员进行初始化,对象在定义的时候对其数据成员进行初始化,对象在定义的时候对其数据成员进行初始化,对象在定义的时候对其数据成员进行初始化,称为对象的初始化称为对象的初始化称为对象的初始化称为对象的初始化 C+C+中对象的初始化由一个特殊的成员函数中对象的初始化由一个特殊的成员函数中对象的初始化由一个特殊的成员函数中对象的初始化由一个特殊的成员函数(构造函数)完成(构造函数)完成(构造函数)完成(构造函数)完成 其主要功能是其主要功能是其主要功能是其主要功能是创建创建创建创建并并并并初始化初始化初始化初始化对象对象对象对

8、象 如果用户不自己定义构造函数,则编译器会自如果用户不自己定义构造函数,则编译器会自如果用户不自己定义构造函数,则编译器会自如果用户不自己定义构造函数,则编译器会自动生成一个动生成一个动生成一个动生成一个默认的默认的默认的默认的构造函数。构造函数。构造函数。构造函数。2022/12/2110构造函数构造函数 定义格式:定义格式:定义格式:定义格式::()构造函数名与类名相同,且不指定函数返回值构造函数名与类名相同,且不指定函数返回值构造函数名与类名相同,且不指定函数返回值构造函数名与类名相同,且不指定函数返回值 一般情况下,应该构造函数定义为一般情况下,应该构造函数定义为一般情况下,应该构造函

9、数定义为一般情况下,应该构造函数定义为公有成员公有成员公有成员公有成员 编译系统自动生成的编译系统自动生成的编译系统自动生成的编译系统自动生成的默认默认默认默认构造参数其形式为:构造参数其形式为:构造参数其形式为:构造参数其形式为::()()2022/12/21Circle类的类的构造函数构造函数inline void Circle:setRadius(double r)inline void Circle:setRadius(double r)radius=r 0?r:1;radius=r 0?r:1;pi=3.1415926;pi=3.1415926;Circle:Circle:Circl

10、eCircle(double r)(double r)cout constructor.endl;cout constructor.endl;setRadius(r);setRadius(r);int main()int main()Circle c(2.5);/Circle c(2.5);/等价于等价于等价于等价于Circle c=2.5;Circle c=2.5;cout area=c.getArea()endl;cout area=c.getArea()endl;return 0;return 0;/能否找到调用构造函数的语句?采用断点查看构造函数于何时运行能否找到调用构造函数的语句?采

11、用断点查看构造函数于何时运行能否找到调用构造函数的语句?采用断点查看构造函数于何时运行能否找到调用构造函数的语句?采用断点查看构造函数于何时运行/构造函数能否定义为私有成员?构造函数能否定义为私有成员?构造函数能否定义为私有成员?构造函数能否定义为私有成员?2022/12/2112说明说明 构造函数不能并且不需要指定函数返回值构造函数不能并且不需要指定函数返回值构造函数不能并且不需要指定函数返回值构造函数不能并且不需要指定函数返回值 对于对于对于对于局部局部局部局部对象对象对象对象c c来说,当程序执行到对象的定义来说,当程序执行到对象的定义来说,当程序执行到对象的定义来说,当程序执行到对象的

12、定义语句语句语句语句“Circle c(2.5);”Circle c(2.5);”时,由编译器秘密调用构时,由编译器秘密调用构时,由编译器秘密调用构时,由编译器秘密调用构造函数完成对象的初始化造函数完成对象的初始化造函数完成对象的初始化造函数完成对象的初始化 构造函数一般定义为公有成员,否则编译器无法构造函数一般定义为公有成员,否则编译器无法构造函数一般定义为公有成员,否则编译器无法构造函数一般定义为公有成员,否则编译器无法成功调用构造函数完成对象初始化成功调用构造函数完成对象初始化成功调用构造函数完成对象初始化成功调用构造函数完成对象初始化设计模式中,往往通过将构造函数设置为私有成员实设计模

13、式中,往往通过将构造函数设置为私有成员实设计模式中,往往通过将构造函数设置为私有成员实设计模式中,往往通过将构造函数设置为私有成员实现现现现“单件单件单件单件(sigleton)”(sigleton)”模式模式模式模式 思考:思考:思考:思考:全局对象和静态对象的构造函数于何时、何处调用全局对象和静态对象的构造函数于何时、何处调用全局对象和静态对象的构造函数于何时、何处调用全局对象和静态对象的构造函数于何时、何处调用2022/12/2113思考思考 用同类对象完成初始化,用同类对象完成初始化,用同类对象完成初始化,用同类对象完成初始化,C+C+帮我们做了什么帮我们做了什么帮我们做了什么帮我们做

14、了什么Circle c(2.5);Circle c(2.5);Circle c1=c;Circle c1=c;cout area=c1.getArea()endl;cout area=c1.getArea()endl;2022/12/2114复制构造函数复制构造函数 主要功能主要功能主要功能主要功能 :用一个已知的对象来初始化一个同类对象用一个已知的对象来初始化一个同类对象用一个已知的对象来初始化一个同类对象用一个已知的对象来初始化一个同类对象 具体声明格式:具体声明格式:具体声明格式:具体声明格式::(const (const&)复制构造函数复制构造函数复制构造函数复制构造函数只有一个参数只

15、有一个参数只有一个参数只有一个参数,是该类对象的引用,是该类对象的引用,是该类对象的引用,是该类对象的引用 若用户没有显式定义复制构造函数,编译器会自若用户没有显式定义复制构造函数,编译器会自若用户没有显式定义复制构造函数,编译器会自若用户没有显式定义复制构造函数,编译器会自动生成一个默认的复制构造函数,其功能是把已动生成一个默认的复制构造函数,其功能是把已动生成一个默认的复制构造函数,其功能是把已动生成一个默认的复制构造函数,其功能是把已知对象的每个数据成员都复制到新定义的对象中知对象的每个数据成员都复制到新定义的对象中知对象的每个数据成员都复制到新定义的对象中知对象的每个数据成员都复制到新

16、定义的对象中2022/12/2115 以下以下3种情况系统调用复制构造函数:种情况系统调用复制构造函数:用类的一个对象初始化同类的另一个对用类的一个对象初始化同类的另一个对象时象时对象作为函数参数传递给函数形参时对象作为函数参数传递给函数形参时函数返回值是类的对象,函数调用完成函数返回值是类的对象,函数调用完成时返回时返回2022/12/2116Circle类的类的复制构造函数复制构造函数inline void Circle:setRadius(double r)inline void Circle:setRadius(double r)radius=r 0?r:1;radius=r 0?r:

17、1;pi=3.1415926;pi=3.1415926;Circle:Circle:Circle(const Circle&c)Circle(const Circle&c)cout copy constructor.endl;cout copy constructor.endl;setRadius(c.radius);setRadius(c.radius);int main()int main()Circle c(2.5);Circle c(2.5);Circle c1=c;Circle c1=c;cout area=c1.getArea()endl;cout area=c1.getArea(

18、)endl;return 0;return 0;/采用断点查看复制构造函数于何时运行采用断点查看复制构造函数于何时运行采用断点查看复制构造函数于何时运行采用断点查看复制构造函数于何时运行2022/12/2117对象的清理工作对象的清理工作 对象的清理工作由析构函数完成对象的清理工作由析构函数完成对象的清理工作由析构函数完成对象的清理工作由析构函数完成 主要功能:主要功能:主要功能:主要功能:在对象生存周期即将结束的时刻,由编译系统自动在对象生存周期即将结束的时刻,由编译系统自动在对象生存周期即将结束的时刻,由编译系统自动在对象生存周期即将结束的时刻,由编译系统自动调用来完成一些清理工作调用来完

19、成一些清理工作调用来完成一些清理工作调用来完成一些清理工作在在在在程序块程序块程序块程序块执行完执行完执行完执行完最后一条最后一条最后一条最后一条语句后,系统自动调用析语句后,系统自动调用析语句后,系统自动调用析语句后,系统自动调用析构函数构函数构函数构函数 语法格式为:语法格式为:语法格式为:语法格式为::()()2022/12/21Circle类的类的析构函数析构函数class Circleclass Circle public:public:Circle(double r=1);Circle(double r=1);Circle(const Circle&c);Circle(const

20、Circle&c);Circle();Circle();void setRadius(double r=1);void setRadius(double r=1);double getRadius()const;double getRadius()const;double getArea()const;double getArea()const;private:private:double radius;double radius;double pi;double pi;CircleCircle:Circle():Circle()cout desctructor.endl;cout desct

21、ructor.endl;int main()int main()Circle c;Circle c;c.setRadius(2.5);c.setRadius(2.5);cout area=c.getArea()endl;cout area=c.getArea()endl;return 0;return 0;2022/12/2119几点说明几点说明 析构函数与类同名,析构函数与类同名,析构函数与类同名,析构函数与类同名,无参数无参数无参数无参数,无需指定返回值,无需指定返回值,无需指定返回值,无需指定返回值 析构函数不能有参数,因此不能重载析构函数不能有参数,因此不能重载析构函数不能有参数,因此

22、不能重载析构函数不能有参数,因此不能重载 析构函数析构函数析构函数析构函数不能回收对象本身所占空间不能回收对象本身所占空间不能回收对象本身所占空间不能回收对象本身所占空间 析构函数的调用顺序和构造函数的调用顺序相析构函数的调用顺序和构造函数的调用顺序相析构函数的调用顺序和构造函数的调用顺序相析构函数的调用顺序和构造函数的调用顺序相反反反反2022/12/2120思考思考(难点难点)class Circleclass Circle public:public:Circle(double r=1);Circle(double r=1);Circle(const Circle&c);Circle(c

23、onst Circle&c);Circle();Circle();void setRadius(double r=1);void setRadius(double r=1);double getRadius()const;double getRadius()const;double getArea()const;double getArea()const;private:private:double radius;double radius;double pi;double pi;2022/12/2121void draw(void draw(Circle cirCircle cir)cout

24、 cout 进进入入入入draw()!endl;draw()!endl;cout cout 这这是一个是一个是一个是一个圆圆!endl;!endl;cout draw()cout draw()执执行即将行即将行即将行即将结结束束束束!endl;!endl;void draw(void draw(const Circle&circonst Circle&cir)cout cout 进进入入入入draw()!endl;draw()!endl;cout cout 这这是一个是一个是一个是一个圆圆!endl;!endl;cout draw()cout draw()执执行即将行即将行即将行即将结结束束束

25、束!endl;!1-存钱存钱存钱存钱 2-2-取钱取钱取钱取钱 3-3-余额查询余额查询余额查询余额查询发现对象发现对象发现对象发现对象2022/12/2124Account类设计类设计1class Accountclass Account public:public:Account(Account(constconst char*pid,char*pid,constconst char*pname,char*pname,constconst char char*ppwd,double b);*ppwd,double b);bool debit(double amount);/withdraw

26、 bool debit(double amount);/withdraw bool credit(double amount);/depositebool credit(double amount);/depositevoid print()const;void print()const;private:private:charchar id17;id17;charchar name20;name20;charchar pwd7;pwd7;double balance;double balance;2022/12/2125Account类设计类设计2class Accountclass Acc

27、ount public:public:Account(Account(constconst char*pid,char*pid,constconst char*pname,char*pname,const const char char*ppwd,double b);*ppwd,double b);bool debit(double amount);/withdraw bool debit(double amount);/withdraw bool credit(double amount);/depositebool credit(double amount);/depositevoid p

28、rint()const;void print()const;private:private:stringstring id;id;stringstring name;name;stringstring pwd;pwd;double balance;double balance;2022/12/2126#include#include#include#include#include Account.h#include Account.husing namespace std;using namespace std;bool Account:credit(double amount)/deposi

29、tebool Account:credit(double amount)/deposite if(amount=0)if(amount=0)cerr cerr 存入金存入金存入金存入金额应额应额应额应大于大于大于大于0!endl;0!balance)if(amount balance)cerr cerr 余余余余额额额额不足不足不足不足!endl;!endl;return false;/return false;/取取取取钱钱钱钱失失失失败败败败!balance-=amount;balance-=amount;print();print();return true;return true;de

30、bit()的类外实现的类外实现2022/12/2128void Account:print()constvoid Account:print()const cout -endl;cout -endl;cout left setw(20)cout left setw(20)账账号号号号:right setw(20)id endl;right setw(20)id endl;cout left setw(20)cout left setw(20)户户名名名名:right setw(20)name endl;right setw(20)name endl;cout left setw(20)cout

31、 left setw(20)余余余余额额:right setw(20)balance endl;right setw(20)balance=0)?b:0;balance=(b=0)?b:0;构造函数的实现构造函数的实现-char2022/12/2130Account:Account(const char*pid,const char Account:Account(const char*pid,const char*pname,const char*ppwd,double b)*pname,const char*ppwd,double b):id(pid),name(pname),pwd(pp

32、wd):id(pid),name(pname),pwd(ppwd)balance=(b=0)?b:0;balance=(b=0)?b:0;构造函数的实现构造函数的实现-string2022/12/21课外思考课外思考1class Circleclass Circle public:public:Circle(double r=1);Circle(double r=1);void setRadius(double r=1)void setRadius(double r=1)double getRadius()const;double getRadius()const;double getArea

33、()const;double getArea()const;private:private:double radius;double radius;double pi;double pi;int main()int main()Circle c;Circle c;c=(2.5);/c=(2.5);/?请请参考参考参考参考explicitexplicit相关知相关知相关知相关知识识cout area=c.getArea()endl;cout area=c.getArea()endl;return 0;return 0;2022/12/2132课外思考课外思考2 对所有对所有对所有对所有Circl

34、eCircle的对象来说,圆周率的对象来说,圆周率的对象来说,圆周率的对象来说,圆周率pipi的取值都的取值都的取值都的取值都是是是是3.141593.14159,pipi定义为类的数据成员是否合适?定义为类的数据成员是否合适?定义为类的数据成员是否合适?定义为类的数据成员是否合适?预习类的静态数据成员预习类的静态数据成员预习类的静态数据成员预习类的静态数据成员 析构函数的代码往往较少,是否该设置为内联析构函数的代码往往较少,是否该设置为内联析构函数的代码往往较少,是否该设置为内联析构函数的代码往往较少,是否该设置为内联函数?函数?函数?函数?参看可能出现的程序代码膨胀参看可能出现的程序代码膨胀参看可能出现的程序代码膨胀参看可能出现的程序代码膨胀2022/12/2133作业作业 预习完第二章预习完第二章预习完第二章预习完第二章2022/12/21

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 大学资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁