网站大量收购独家精品文档,联系QQ:2885784924

第7章 指针及引用.ppt

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

-*- 复制构造函数的形式 复制构造函数符合构造函数的形式 接收1个参数:同类对象的引用,为了防止对同类对象的修改,常声明为const引用 Tricycle( const Tricycle trike ); 通过传入的trike对象,创建和trike“相同”的新对象。 -*- 浅复制的问题 如果类中只包含简单数据成员,没有指向堆的指针,可以使用编译器提供的默认复制构造函数 如果类中包含指向堆中数据的指针,浅复制将出现严重问题 浅复制直接复制两个对象间的指针成员,导致两个指针指向堆中同一块内存区域 一个对象的修改将导致另一个对象的修改 一个对象超出作用域,将导致内存释放,使得另一个对象的指针无效,对其访问将导致程序异常。 -*- 编写自己的复制构造函数 含有指针成员的类,通常需要编写构造函数和复制构造函数,同时需要实现相应的复制构造函数,以及运算符重载(以后介绍) 实现“深复制”,创建对象备份时,为新对象在堆中分配自己的内存,并将现有值复制到新内存中。 -*- 【例7-15】含有指针成员的Tricycle类 class Tricycle { public: Tricycle(); Tricycle(const Tricycle rhs); ~Tricycle(); int getSpeed() const { return *speed; } void setSpeed(int newSpeed) { *speed = newSpeed; } void pedal(); void brake(); private: int *speed; }; speed所指内存在堆中分配 -*- 【例7-15】 Tricycle类 Tricycle::Tricycle() { speed = new int; *speed = 5; } Tricycle::Tricycle(const Tricycle rhs) { speed = new int; *speed = rhs.getSpeed(); //或:*speed = *rhs.speed; } Tricycle::~Tricycle() { delete speed; speed = NULL; } 构造函数中分配内存,析构函数中释 放内存。 默认复制构造函数中,不会分配内存 只是执行speed = rhs.speed。 -*- 【例7-15】 Tricycle类 void Tricycle::pedal() { setSpeed(getSpeed() + 1); //或(*speed) ++; std::cout “ Pedaling getSpeed() “\n; } void Tricycle::brake() { setSpeed(getSpeed() - 1); std::cout “ Pedaling getSpeed() “\n; } pedal中通过setSpeed设置新速度,也可以直接修改数据 *speed += 1,但通过调用setSpeed可以隐藏实现细节。 更进一步:setSpeed ( getSpeed()+1 ); 不用关心speed 到底是如何存储等实现细节。 -*- 【例7-15】测试Tricycle类 #include iostream int main() { Tricycle wichita; Tricycle dallas(wichita); wichita.setSpeed(10); std::coutWichita; wichita.pedal(); std::coutDallas; dallas.pedal(); std::coutWichita; wichita.brake(); std::coutDallas; dallas.brake(); return 0; } 复制构造后,新创建的dallas 和wichita的状态相同。 *speed都是5 复制构造后,两个对象是独立 的对象,可独立设置修改状态, 与引用关系不同。 -*- 本章内容安排 7.1 创建和使用指针变量 7.2 栈和堆(new与delete动态内存分配) 7.3 创建和使用引用 7.4 数据成员中的指针与引用 7.5 堆中创建、访问与删除对象 7.6 复制构造函数中的深拷贝与浅拷贝

文档评论(0)

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

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

1亿VIP精品文档

相关文档