第2讲类与对象(1)_第1页
第2讲类与对象(1)_第2页
第2讲类与对象(1)_第3页
第2讲类与对象(1)_第4页
第2讲类与对象(1)_第5页
已阅读5页,还剩94页未读 继续免费阅读

下载本文档

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

文档简介

第2讲类与对象 1 2 C 案例背景介绍 从本章开始 我们将按照面向对象的程序设计思想实现一个简化的 大学人员信息管理系统 所谓面向对象的程序设计 程序的核心是数据 人员信息管理 的核心数据是 人员信息 因此需要将不同的人员抽象出来 对其属性数据和行为进行封装 在大学里 主要有两大类人员 学生和教职员工 其中学生又可分为本科生和研究生等 而教职员工又可分为教师和职员等 我们对不同类的人员所具有的属性和行为进行描述 称为数据抽象 形成了 类 的概念 一个类的实例称为类的 对象 对应着问题域中的实体 例如 学校里的学生很多 他们都具有同样的属性和行为 抽象成为 学生类 CStudent 学生李明对应到程序中就是CStudent类对象liming 3 本讲主要内容 类与对象的基本概念构造函数与析构函数对象数组和对象指针常成员函数与常对象 4 类与对象的基本概念 5 分析 在案例程序的背景下 分析 学生 具有的属性和行为主要有 姓名学号性别出生日期专业所属院系所属班级各科成绩身高体重爱好 睡觉吃饭上课考试上自习背单词社团活动打球选课查询成绩做作业 例2 1 学习面向对象程序设计中类的概念 描述案例程序中 学生 的属性和行为 建立学生类的对象 并利用C 的输入输出方式实现学生信息的输入和输出 根据程序的功能进行取舍和细化 将与程序无关的属性数据和行为去除 谓之 数据抽象 6 1 C 类的构成与定义 抽象出一个基本的类 CStudent类 该类包含两部分信息 属性数据以不同类型的数据表现操作 行为 以函数形式表现 7 CStudent类的属性数据 charm strName 20 姓名charm strID 12 编号charm cSex 性别 0代表男1代表女charm strMajor 20 专业 8 CStudent类的行为 部分 voidSetName char strName 设置学生姓名voidGetName char strName 获取学生姓名voidSetID char strID 设置学生IDvoidGetID char strID 获取学生ID 对于每一个属性数据 通常需要为之设计两个基本操作 设置 Set 该属性数据的值 获取 Get 该属性数据的值 9 includeusingnamespacestd classCStudent private charm strName 20 姓名charm strID 12 编号charm cSex 性别 0 男 1 女charm strMajor 20 专业 数据成员 关键字class用以声明一个类class后面的CStudent是用户自定义类名CStudent是一个新的类型 私有成员在关键字private后面声明 该域放在前面时 private可以省略 只允许本类中的函数访问 而类外部的任何函数都不能访问 10 public voidSetName char strName voidGetName char strName voidSetID char strID voidGetID char strID voidSetSex charcSex voidGetSex char 不要忘了类的结束符 成员函数声明 公有成员在关键字public后面声明 它们是类与外部的接口 任何外部函数都可以访问公有类型数据和函数 voidCStudent SetName char strName strcpy m strName strName voidCStudent GetName char strName strcpy strName m strName voidCStudent SetID char strID strcpy m strID strID voidCStudent GetID char strID strcpy strID m strID voidCStudent SetSex charcSex m cSex cSex 11 成员函数的定义注意 函数名前面需要加上类名引导 voidCStudent GetSex char 12 13 intmain CStudentStudent1 Student1 SetName 张明 Student1 SetID 50201000901 Student1 SetSex 0 Student1 SetMajor 软件工程 Student1 DisplayInfo return0 程序的运行结果 姓名 张明编号 50201000901性别 男专业 软件工程 定义学生类的对象 调用学生类的成员函数 14 类与对象的概念及使用 1 C 类的构成类是一种将数据和操作合并为单一结构的类型定义 用方程式表示 类 数据 操作 函数 C 类的构成包括类的声明 成员函数的定义两个部分 15 2 类的声明 类的声明包括 类的成员声明和类成员的访问控制声明 形式 class类名 private 私有数据和函数public 公共数据和函数protected 保护数据和函数 只允许本类中的函数访问 而类外部的任何函数都不能访问 可供程序中的其他函数访问 是类的对外接口 类定义的结束标志 容易被漏掉 在类中 数据成员 datamemeber 又称为成员变量 membervariable 成员函数 memberfunction 又称为方法 method 16 类的声明 class类名 私有数据成员和私有成员函数protected 保护数据成员和保护成员函数public 公有数据成员和公有成员函数 当关键字private紧接着类的第1个花括号时 可以省略该关键字 即类成员默认是私有的 17 注意 类名后面的 表示类的声明范围 最后的分号表示类声明的结束 建议把所有的私有成员和公有成员归类放在一起 并将私有成员放在公有成员的前面 数据成员可以是任意数据类型 不能在类的声明中给类的数据成员赋初值 在类对象定义之后才能给数据成员赋初值 18 例如 classCStudent char m strName 张三 姓名charm cSex 1 性别public voidSetName char strName 设置姓名voidGetName char strName 获取姓名voidSetSex charcSex 设置性别voidGetSex char cpSex 获得性别 不能在类的声明中给类的数据成员赋初值 19 3 成员函数的定义 类的成员函数属于类的成员 它可以访问或调用本类的任何数据成员和成员函数 成员函数可以被限定为私有的 private 公有的 public 或受保护的 protected 对于私有成员函数 只能被本类的其他成员函数所调用 对于公有成员函数 可以作为类对外的接口 被外部调用 C 类中的成员函数的定义既可放在类中 也可放在类的外面 20 成员函数定义方式一 外部定义 类定义中只有成员函数的声明 成员函数的定义 即成员函数体在类的外部完成 其形式为 返回类型类名 函数名 参数表 函数体 类名加在成员函数名之前 而不是加在函数的返回类型前 当在类声明的外面定义成员函数时 需要在函数名的前面加上类名和作用域运算符 以标明该函数是属于该类的 21 定义在外部的成员函数 classCStudent 学生类 private charm strName 20 姓名charm strID 12 编号charm cSex 性别 0 男 1 女charm strMajor 20 专业public voidSetName char strName 成员函数声明 voidCStudent SetName char strName 成员函数定义 strcpy m strName strName 在类定义的外部定义成员函数 必须在该函数前面使用 类名 表达式形式把它与该类紧密连在一起 否则编译器就会认为该函数是一个与类中的成员函数同名的普通函数 22 说明 SetName GetName SetSex GetSex 等都在类的外部定义 但它们是类的成员函数 可以直接使用m strName m strID m cSex等私有数据成员 在定义成员函数时 对函数所带的参数 不但要说明它的类型 还要指出参数名 在定义成员函数时 其返回类型要与类声明中的函数原型中的返回类型一致 23 成员函数定义方式二 内联函数 直接将成员函数定义在类的内部 通常是不包含循环的简单成员函数可以定义在类的内部 定义在类的内部的成员函数自动成为 内联函数 内联函数又称为内置函数 当程序中出现对内联函数的调用时 C 编译器直接将函数体中的代码插入到调用该函数的语句处 同时用实参来代替形参 24 内联成员函数的隐式定义 classCStudent 学生类 private charm strName 20 姓名charm strID 12 编号charm cSex 性别 0 男 1 女charm strMajor 20 专业public voidSetName char strName 成员函数 strcpy m strName strName 内联成员函数 25 内联成员函数的显式定义 声明部分 classCStudent 学生类 private charm strName 20 姓名charm strID 12 编号charm cSex 性别 0 男 1 女charm strMajor 20 专业public voidSetName char strName voidGetName char strName 类中只有成员函数的声明 26 内联成员函数的显式定义 函数定义部分 inlinevoidCStudent SetName char strName strcpy m strName strName inlinevoidCStudent GetName char strName strcpy strName m strName 当在类声明的外面定义成员函数时 需要在函数名的前面加上类名和作用域运算符 以标明该函数是属于该类的 在函数定义前冠以关键字 inline 以此显式说明这是一个内置函数 注意 inline 必须出现在函数定义处 27 编程规范 变量命名方法 常见的变量命名方法有 骆驼命名法 匈牙利命名法和帕斯卡命名法 在C 中 以帕斯卡命名法和骆驼命名法居多 匈牙利命名法则广泛应用于MicrosoftWindows环境中 匈牙利命名法的基本原则是 变量名 属性 类型 对象描述其中每一对象的名称都要求有明确含义 可以取对象名字全称或名字的一部分 匈牙利命名法 这种命名技术是由一位能干的Microsoft程序员查尔斯 西蒙尼 CharlesSimonyi 提出的 他出生在匈牙利 在Microsoft公司中和他一起工作的人都使用这种约定 这种命名法就通过微软的各种产品和文档资料向世界传播开了 匈牙利命名法非常便于记忆 而且使变量名非常清晰易懂 这样 增强了代码的可读性 方便各程序员之间相互交流代码 标识符的名字以一个或者多个小写字母开头作为前缀 前缀之后的是首字母大写的一个单词或多个单词组合 该单词要指明变量的用途 28 匈牙利命名法 匈牙利命名法通过在变量名前面加上相应的小写字母的符号标识作为前缀 标识出变量的作用域 类型等 这些符号可以多个同时使用 顺序是先m 成员变量 再指针 再简单数据类型 再其它 例如 m lpszStr 表示指向一个以0字符结尾的字符串的长指针成员变量 lp是LongPointer sz以null做结尾的字符串型 StringwithZeroEnd 29 30 课程案例设计与编码 演示与课堂练习1 31 编写CStudent类 类的声明 成员函数的定义 说明 每个类对应两个文件 一个 cpp文件 成员函数的定义 一个 h文件 类的声明 32 课堂练习 10分钟 按照刚才的演示 自己编写CStudent类 要求 1 建立项目 分别建立 cpp文件和 h文件 2 添加数据属性charm strName 20 姓名charm strID 12 编号charm cSex 性别 0 男 1 女charm strMajor 20 专业3 为每个属性数据编写相应Set Get成员函数 33 4 对象的定义和使用 类的使用 class定义的是类型 具有类类型的变量称为对象 声明了类之后 在类的使用时再定义对象 一旦定义了class之后 就可以像用int那样去定义对象 34 intmain CStudentStudent1 Student1 SetName 张明 Student1 SetID 50201000901 Student1 SetSex 0 Student1 SetMajor 软件工程 Student1 DisplayInfo return0 类型名 CStudent类型的变量 对象 对象的使用 35 定义对象的格式 类名对象名1 对象名2 如 CStudentstudent1 student2 student1 student2是CStudent类类型的对象 类是某类事物共同属性和共同行为的抽象 而对象则是类的某一个实例 同基本数据类型一样 C 中的类也是一种数据结构 只不过这种数据结构是自定义的 36 对象的使用 使用对象成员 对象的使用是指对对象成员的使用 不论是数据成员还是成员函数 只要是公有的 就可以被外部函数直接使用 使用格式 对象名 数据成员对象名 成员函数 实参表 称为 对象选择符 简称点运算符 调用成员函数的形式类似于访问一个结构对象的分量 先指明对象 再指明分量 37 例2 2 二维点类对象的定义与使用 classCPoint private intx y public voidSetPoint intm intn intGetX intGetY intmain CPointpoint1 point1 SetPoint 100 200 cout point1 x point1 GetX point1 y point1 GetY endl return0 定义对象 调用对象的公有成员函数 不能改成 cout point1 x point1 x point1 y point1 y endl 为什么 38 用指向对象的指针变量引用类中的成员格式 指针变量名 数据成员名指针变量名 成员函数名 参数 intmain CPointpoint1 p p 通过指针调用对象的公有成员函数 39 通过对象的引用访问对象的成员 intmain CPointpoint1 定义对象CPoint 40 类成员函数代码的存储 类中定义的成员函数代码被分配在存储空间的一个公用区域 由该类的所有对象共享 而对象中存储的是共享代码的存储地址 m strName 张三 m strID 1002 m cSex 1 m strMajor 计算机 GetName 代码地址 SetName 代码地址 GetName 代码 SetName代码 student1 student2 代码 m strName 李四 m strID 2003 m cSex 0 m strMajor 软件工程 GetName 代码地址 SetName 代码地址 41 总结 1 类成员的访问属性的设定 一般情况下 数据是私有的 成员函数是公有的 这样做的好处是 任何有关类的错误 都是由类中的数据成员或成员函数引起的 可以缩小错误范围 利于及早排除错误 修改类的性质 只需修改它的成员 只要对象的功能保持不变 则成员函数名所形成的接口就不会变化 这种修改不会影响使用该对象的软件系统 42 总结 2 封装的作用 类是数据 代码的封装体 封装不仅仅是将数据 操作组装在一起 而是还要隐藏数据 封装的目的使其它对象或者本对象都不能修改该对象拥有的数据 而要通过成员函数来修改 这样 避免了程序间的相互干扰 43 下图是一个类的描述 CStudent类 SetName GetName GetSex SetSex m strNamem strIDm cSexm strMajor 内部数据成员 外部成员函数 图CStudent类的描述 44 总结 3 类的作用域 类的作用域是指在类的声明中的一对花括号所形成的作用域 一个类的所有成员位于这个类的作用域内 一个类的任何成员都能访问同一个类的任一其他成员 C 认为一个类的全部成员都是一个整体的相关部分 类作用域是指类定义和相应的成员函数定义的范围 45 内外有别 在类的作用域内 一个类的成员函数对同一类的数据成员具有无限的访问权 而在类的外部 对该类的数据成员和成员函数的引用是要受限制的 有时是不允许的 在类的外部不能直接以单个名字引用数据成员 46 通过CStudent的例子 我们看一个简单的C 程序最基本的内容包括哪些 47 总结 4 C 的程序结构 一个完整的C 源程序的结构 基本上都是由三个部分来构成 类的声明 类成员的实现 主函数main 即类的使用 48 三个部分 多文件组织程序 类声明文件 将类的声明作为一个头文件来存放 文件扩展名为 hpp或 h 类实现文件 将成员函数的定义单独组成一个文件 其中只含有关于类的成员函数的定义 可单独编译 但不能运行 因为没有main 函数 文件扩展名为 cpp 类使用文件 将类的使用放在一个文件里 其中包含一个main 函数 文件扩展名为 cpp 49 图C 的程序结构 ClassA include A hpp intA fun include A hpp main Aob cout ob fun 类界面A HPP 类实现A CPP 类使用 50 1 hpp 图C 程序开发示意图 1 cpp 2 hpp 2 cpp n hpp n cpp 预处理 编译单元1 编译单元2 编译单元n 编译 1 obj 2 obj n obj 连接 exe 可执行文件 运行 libC 标准库函数标准类库 51 多文件的好处 对于更为复杂的程序 每个类都有单独的声明和实现文件 采用这样的组织结构 可以对不同的文件进行单独编写 编译 最后再连接 同时可以利用类的封装特性 在程序的调试 修改时只对其中某一个类的声明和实现进行修改 其余不动 使程序更容易管理 控制以及调试 52 课程案例设计与编码 课堂练习2 53 课堂练习 补充和使用CStudent类 CStudent类的使用 设计main函数 使用多个成员函数设置 输出属性数据很麻烦 要求补充两个成员函数 voidInitStudent 初始化学生信息voidDisplayStatus 显示学生基本信息说明 1 增加CStudent类的使用文件main cpp 2 初步考虑在程序中检查输入数据的合法性 54 构造函数与析构函数 55 例2 4 通过带参数的构造函数完成数据成员的初始化 56 Student h文件 构造函数的原型classCStudent 学生类 private charm strName 20 姓名charm strID 12 编号charm cSex 性别 0 男 1 女charm strMajor 20 专业public CStudent char strName char strID charcSex char strMajor voidSetName char strName voidGetName char strName voidSetID char strID voidGetID char strID voidDisplayInfo 带参数的构造函数 57 Student cpp文件CStudent CStudent char strName char strID charcSex char strMajor strcpy m strName strName strcpy m strID strID m cSex cSex strcpy m strMajor strMajor voidCStudent SetName char strName strcpy m strName strName voidCStudent GetName char strName strcpy strName m strName 构造函数的定义 58 stumain cpp文件intmain CStudentStudent1 张明 50201000901 0 软件工程 Student1 DisplayInfo return0 当定义对象时 该对象的构造函数被自动调用 59 构造函数的特点 构造函数名与类名相同 构造函数没有函数返回值 即将返回值说明成void也不行 在定义对象时 通过new运算符分配类对象的内存时 会自动调用构造函数 例 CStudent pStu newCStudent 张明 50201000901 0 软件工程 pStu DisplayInfo deletepStu 构造函数的特点 构造函数一般声明为公有成员 但是它不能被显式地调用 不需要显式提供实际参数就能调用的构造函数称为默认构造函数 包括不带参数的构造函数和所有形参都有默认参数的构造函数 如果用户没有显式地在类中写出构造函数 那么系统会为该类自动生成一个不带参数的默认构造函数 该默认构造函数的形式如下 类名 类名 60 同普通函数一样 构造函数也可以被重载 利用重载的构造函数 可以采用多种方式完成类对象的初始化 61 构造函数的重载 62 构造函数的重载 classCStudent 学生类 private charm strName 20 姓名 public CStudent CStudent char strName char strID charcSex char strMajor voidSetName char strName voidGetName char strName voidSetID char strID voidGetID char strID voidDisplayInfo 不带参数的构造函数 带参数的构造函数 63 CStudent CStudent strcpy m strName strcpy m strID m cSex 0 strcpy m strMajor CStudent CStudent char strName char strID charcSex char strMajor strcpy m strName strName strcpy m strID strID m cSex cSex strcpy m strMajor strMajor 64 intmain CStudentStudent1 张明 50201000901 0 软件工程 Student1 DisplayInfo CStudentStudent2 Student2 DisplayInfo return0 创建新对象 调用了带参数的构造函数 创建新对象 调用不带参数的构造函数 65 注意 1 如果用户没有显式地定义类的构造函数 系统会生成一个函数体为空的构造函数 但是 一旦类中已经定义了一个构造函数 无论它是什么形式的 系统就不再提供默认的构造函数 如果在本例中没有定义不带参数的构造函数 那么下面的语句就会出现编译错误 CStudentStudent2 错误 系统找不到对应的构造函数 2 当使用不带参数的构造函数创建对象时 应使用下面形式的语句 CStudentStudent2 而不能写成 CStudentStudent2 这是因为系统会把上面的语句解释成一个名称为Student2的普通函数的原型声明 该函数的返回值是CStudent类型 66 带默认参数的构造函数 classCStudent 学生类 public 带默认参数的构造函数CStudent char strName char strID charcSex 0 char strMajor voidSetName char strName CStudent CStudent char strName char strID charcSex char strMajor strcpy m strName strName strcpy m strID strID m cSex cSex strcpy m strMajor strMajor 带默认参数的构造函数 这里不再需要给出默认参数 67 析构函数 当删除一个对象时 需要调用析构函数 destructorfunction 析构函数是类中的特殊成员函数 其作用是 执行析构函数中的代码将对象占据的存储空间归还系统做公共及用户要求的善后工作例如 可以在析构函数中释放由new运算符分配的内存 在Windows窗口被关闭时通过析构函数保存窗口的内容 68 析构函数的定义形式 类名 析构函数名 析构函数名前加上一个逻辑非运算符 表示 逆构造函数 69 如果类中没有定义析构函数 系统自动建立一个缺省的析构函数 这个缺省的析构函数没有任何参数 并且函数体为空 该默认析构函数的目的是释放对象所占据的存储空间 即 类名 析构函数名 系统缺省的析构函数 CStudent CStudent 70 CStudent CStudent 析构函数 cout endl 学生 GetName 被析构 endl 对于大多数类而言 缺省的析构函数就能满足要求 71 需要自己定义析构函数的情况 如果在一个对象完成其操作之前需要做一些内部处理 则应该显式地定义析构函数 例如下面的情形 在构造函数中使用new运算符为对象分配了堆内存 需要定义析构函数使用delete来释放堆空间 在构造函数中打开了文件 则需要定义析构函数将文件关闭 在Windows窗口被关闭时通过析构函数保存窗口的内容 72 例2 7 定义析构函数完成堆内存的释放 将前面例题中学生类的属性数据m strName m strID等 由先前的静态数组方式改为动态内存存储方式 修改步骤 将原来定义的数组全部改为指针 将构造函数中的代码改为 使用new申请堆空间 放置字符串 修改原来的Set函数 修改或删除原来的无参构造函数 如下 73 classCStudent 学生类 private char m strName 姓名char m strID 编号charm cSex 性别 0 男 1 女char m strMajor 专业public 构造函数CStudent char strName char strID charcSex 0 char strMajor CStudent 析构函数voidSetName char strName voidGetName char strName voidDisplayInfo 析构函数名称与类名相同 函数名前面有1个前导符 74 CStudent CStudent char strName char strID charcSex char strMajor m strName newchar strlen strName 1 strcpy m strName strName m strID newchar strlen strID 1 strcpy m strID strID m cSex cSex m strMajor newchar strlen strMajor 1 strcpy m strMajor strMajor CStudent CStudent delete m strName delete m strID delete m strMajor 析构函数没有返回值 也不能有void类型 析构函数没有参数 析构函数只能回收不是用运算符new创建的对象空间 使用new创建的空间 需要使用运算符delete来进行释放 使用new为字符串分配存储空间的典型写法 75 voidCStudent SetName char strName 释放掉构造函数中分配的内存delete m strName 重新根据输入字符串的长度分配内存m strName newchar strlen strName 1 strcpy m strName strName voidCStudent GetName char strName strcpy strName m strName 76 intmain CStudentStudent1 张明 50201000901 0 软件工程 Student1 DisplayInfo return0 析构函数是在对象的生存期结束时 由系统自动调用 回收对象占用的空间 它的调用完成后 对象也就消失了 相应的内存空间也被释放 程序执行到main函数的右花括号处 对象Student1生存期结束 在析构函数的函数体中加入下面的语句 以便观察程序的运行结果 cout 析构函数被调用 endl 析构函数的说明 1 析构函数的名称由类名和前面的波浪号 构成 即 类名 2 析构函数没有参数 因此不能被重载 每个类只能有一个析构函数 3 析构函数没有函数返回值 也不能指定它的函数返回值类型 4 对象消亡时 生命期结束时 系统会自动调用该对象的析构函数 如果一个对象是通过new运算符动态生成的 那么在通过delete运算符释放该对象时 会自动调用析构函数 77 78 总结 构造函数和析构函数的特点 没有返回值不能被继承不能取它们的地址当创建对象时 系统自动调用构造函数 不能用常规方法在程序中直接调用 系统缺省版本的构造函数做公共初始化工作 用户提供版本的构造函数做用户要求的初始化工作 79 拷贝构造函数 80 拷贝构造函数 复制构造函数 可用一个已有对象去构造一个新对象 例如 voidmain 使用拷贝构造函数 CStudentStudent1 张明 50201000901 0 软件工程 Student1 DisplayInfo CStudentStudent2 Student1 Student2 DisplayInfo 用Student1的值去初始化Student2 81 对象作为函数的参数传递时 也要涉及对象的拷贝 例如 voidfn CStudentstu2 voidmain CStudentstu1 fn stu1 函数fn 的参数传递的方式是传值 参数类型是CStudent 调用时 实参stu1传给了形参stu2 stu1在传递过程中是不会改变的 形参stu2是stu1的一个拷贝 即形参是由实参构造的 82 使用缺省的拷贝构造函数 虽然我们没有定义拷贝构造函数 但系统自动建立了一个缺省的拷贝构造函数 类名 const类名 ob 这个缺省的拷贝构造函数会将一个已存在的对象复制给新对象 现在我们用的就是缺省的拷贝构造函数 运行程序看运行结果 83 voidmain 使用拷贝构造函数 CStudentStudent1 张明 50201000901 0 软件工程 Student1 DisplayInfo CStudentStudent2 Student1 Student2 DisplayInfo 缺省的拷贝构造函数的形式 CStudent CStudent constCStudent stu 说明由缺省的拷贝构造函数建立的对象Student2在析构时出了问题 涉及到存放学生姓名 编号和专业的堆空间 84 程序运行结果 85 图Student2对象创建时拷贝Student1对象 student1对象 存放学生姓名字串的堆空间 m strName student2对象 m strName 为什么使用缺省的拷贝构造函数会出问题 因为CStudent对象申请了系统的资源 堆空间 由于资源归属权不清 将引起资源管理的混乱 86 Student1对象 Student2对象 图对象析构时按构造相反的顺序先student2 再student1 存放学生姓名字串的堆空间 m strName 为什么使用缺省的拷贝构造函数会出问题 CStudent CStudent 析构函数 cout endl 学生 m strName 被析构 endl delete m strName 对象Student1的成员m strName成为悬挂指针 m strName 87 CStudent CStudent constCStudent stu的姓名复制到新对象的m strNname 拷贝构造函数是一种特殊

温馨提示

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

评论

0/150

提交评论