类与对象之堆栈与拷贝构造函数讲述.ppt

  1. 1、本文档共20页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
类与对象之堆栈与拷贝构造函数讲述

第七讲 堆内存与拷贝构造函数 学 习 要 求 掌握new和delete操作符的使用(从堆区分配内存) 理解拷贝函数的实质,区别深拷贝和浅拷贝,适当的运用拷贝构造函数 7 . 1 存储空间 在栈区分配的内存系统自动回收,如函数内部的局部变量。 int f1( int val) { int a; a = val; return a; } main() { int b, c = 10; b = f1(c); } 深复制与浅复制 C++提供默认的复制机制,用于赋值运算和临时对象的创建,默认的复制机制是简单的按位复制例题:deepcopy例【11-2】 class student { public: //…… student(int, char*); private: int age; char *name; } Main() { student stu1(20,”Zhang”), stu2(21, “Li”); stu2 = stu1; } 深复制与浅复制 运算符的重载例【11-2】 class student { public: //…… student(int, char*); student operator = (const student other); private: int age; char *name; } Main() { student stu1(20,”Zhang”), stu2(21, “Li”); stu2 = stu1; } C++提供了操作符new和delete来分配和释放内存块,分配的内存在堆区 在操作堆内存时,如果分配了内存,就有责任回收它否则运行的程序将会造成内存泄漏 . C++中不提倡使用malloc( )和free( )函数来分配和释放内存,一是使用函数需在头文件中声明;二是,malloc( )在分配空间时,不能调用构造函数. 类对象的建立是分配空间、构造结构和初始化的统一,这些均由构造函数来完成 . 这些过程malloc( )不能实现 .而free函数也并不调用析构函数 .例题:deepcopy 7 . 2 拷贝构造函数 定义变量时,可用一个已知变量来初始化另一个变量 . 例如 int x=10 , y = x ; 在定义对象时,能否用一个已知的对象来初始化另一个对象呢? C++允许在一个类的构造函数中带一个对这个类对象的引用的参数,这样的特殊的构造函数称为拷贝构造函数 拷贝构造函数是类的一个公有成员函数,是一类特殊的构造函数 . 函数名与构造函数一样,也是它所属类的类名 . 它只有一个参数,且参数是同类的一个对象的引用 . 功 能:用一个已知的对象来初始化一个被创建的同类的对象 . 拷贝构造函数的声明与定义 拷贝构造函数的说明 1: 用类的一个对象去初始化该类的另一个对象;函数的形参是类的对象;函数的返回值是类的对象 . 拷贝构造函数只有一个参数,此参数是本类的对象 (不能是其他类的对象),且采用对象的引用的形式(一般约定加const声明,使参数值不能改变,以防在调用函数时因不慎修改对象值 ). 拷贝构造函数的说明 2: 普通构造函数和拷贝构造函数在形式上和在建立对象时,实参的类型是不同的 . 一般构造函数在建立对象时被调用,拷贝构造函数在用已有对象复制一个新对象是调用,即新建立一个对象并用同类对象对其初始化时 . 【例 】拷贝构造函数的应用举例 默认拷贝构造函数 上面的程序, 用户在类中定义了拷贝构造函数 ,如果未定义拷贝构造函数,则C++ 编译系统自动提供了一个默认拷贝构造函数,其作用只是简单地复制类中的每个数据成员 . 7 . 3 临时对象 当函数返回一个对象时,要创建一个临时对象以存放返回的对象 . 规定,创建的临时对象,在整个创建它们的外部表达式范围内有效,否则无效 . 关于考试 * C++的内存格局通常分为四个区:例题:memorytypes (1)全局数据区( data area); (2)代码区(code area); (3)栈区(stack area); (4)堆区(自由存储区 heap area); 全局变量、静态数据、常量存放在全局数据区 所有类成员函数和非成员函数代码的存放区 为运行函数而分配的局部变量、函数参数、返回数据、返回地址等,函数返回后自动释放 余下的内存空间 如果a是一个对象会有什么问题? Zhang\0 stu1 age = 20 name* Li\0 stu2 age = 21 name* Li\0

文档评论(0)

shuwkb + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档