初学C基础知识要点.ppt

上传人:xt****7 文档编号:5350101 上传时间:2020-01-26 格式:PPT 页数:44 大小:432.31KB
返回 下载 相关 举报
初学C基础知识要点.ppt_第1页
第1页 / 共44页
初学C基础知识要点.ppt_第2页
第2页 / 共44页
初学C基础知识要点.ppt_第3页
第3页 / 共44页
点击查看更多>>
资源描述
C 程序设计 主讲 李晓勇Email lxyonghn Telphone 13819194055 一 友元 1 引入理由安全性 封装 类的成员函数才能访问类的私有成员 其他函数不能访问私有成员的 高效率 非封装 1 将数据定义成公有成员 破坏隐藏性 2 友元函数 提高效率 破坏隐藏性 2 友元特点 1 在类中用friend说明 位置任意 含义相同 2 友元分 例1 在平面上计算两个点之间的距离 假设第一个点 x1 y1 第二个点 x2 y2 普通函数作友元函数 classpoint 点的类 public point doublexx doubleyy x xx y yy voidprint xy cout x y endl frienddoubledistance point doubledistance point classB 说明classA public voiddisp Bvb protected intx classB public B intm y m voidfriendA disp Bvb cout vb y vb y endl protected inty 例2 其他类的成员函数作友元函数 voidmain Aa1 Bb1 100 a1 disp b1 通过a1的成员函数 调用b1的数据成员 运行结果 vb y 100 例3 普通函数成为两个类的友员 classBoat classCar public Car intj size j friendintleisure inttime Car classBoat public Boat intj size j friendintleisure inttime Car voidmain Carc1 2 Boatb1 3 inttime 4 cout leisure time c1 b1 结论 友元函数可以是一个普通的函数 也可以是其他类的成员函数 它不是本类的成员函数 在友元函数中可以通过对象名访问类的私有和保护成员 例4 类作为友元 classy classx friendclassy 类作为友元 说明位置任意public voidset inti m i voidset yy1 private intm classy public voiddisp xp cout p m p m endl private intn friendclassx 类作为友元 说明位置任意 voidx set yy1 m y1 n voidmain xa1 ya2 a1 set 95 a2 disp a1 输出 p m 95 说明 当y类作为x类的友元时 y的成员函数成为x类的友元 即y的成员函数可以访问x类中任意成员 关于友元类的说明 1 友元关系是不能传递的 A类是B类的友元 B类是C类的友元 则A类与C类之间没有任何关系 2 友元关系是单方向 A类是B类的友元 则A类的成员函数可以访问B类中的所有成员 但B类中的成员函数不能访问A类中的所有成员 二 运算符重载 1 什么是运算符重载 赋予已有的运算符多重含义 运算符是一种特殊的函数 例 4 5 4 5函数的语义可以重新定义 重新定义的运算符又称运算符函数 2 目的 使C 代码更直观 更易读 3 哪些运算符可以重载 可以重载 算术运算符 位操作运算符 逻辑运算 比较运算 赋值运算 其他 new delete 不能重载 取内容 圆点 域运算符 三目运算符 sizeof等 4 运算符重载后 优先级 结合性问题 重新定义的运算符 不改变原运算符的优先级和结合性 也不改变运算符的语法结构 即单目运算不变 双目运算也不变 5 重载运算符的限制 1 不能创造新的运算符 2 操作数不变 优先级不变 结合性不变 语法结构不变 3 操作数至少有一个类的对象 6 运算符重载方式 1 重载为类的成员函数形式 类型类名 operator运算符 参数表 2 重载为友元函数 但 不能重载 friend类型operator运算符 参数表 例1 成员函数方式重载运算符 将数学中的复数定义成一个类 重载加法运算符 使得两个复数直接加 如c1 c2 完成复数的实部 虚部分别相加 如不用类 不用运算符重载 则只能用结构形式 例 structcomplex doublereal doubleimage c1 c2 c3 c3 real c1 real c2 real 设c1 c2已知c3 image c1 image c2 image 或者 cal c1 c2 c3 函数方式实现 用类 运算符重载方式实现 classcomplex public complex real image 0 complex doubler doublei 构造函数 real r image i complexoperator constcomplex 函数的返回值必须是complexcomplexcomplex operator constcomplex voidmain complexc1 2 0 4 0 c2 4 0 2 0 c3 c3 c1 c2 对象赋值print c3 输出 运行结果 6 2i说明 1 函数的参数可以不用const 也可以不用引用 2 复数的减法 乘法 除法定义相似 差别 例2 用友元方式实现重载 classcomplex public complex real image 0 complex doubler doublei real r image i friendcomplexoperator constcomplex 运算值类型 友元函数的定义complexoperator constcomplex voidprint complex voidmain complexc1 2 0 3 0 c2 4 0 2 0 c3 c3 c1 c2 对象赋值print c3 print complex 2 4 complex 1 2 两个常复数对象相加 说明 1 函数的参数可以不用const 也可以不用引用 2 复数的减法 乘法 除法定义相似 练习5 1 平面点重载 运算符 在主函数中测试 例3 前缀 后缀 的重载 classcounter public counter value 0 counteroperator 前缀加重载counteroperator int 后缀加重载counteroperator 圆括号重载voidprint cout value endl private intvalue countercounter operator 圆括号重载定义 return this countercounter operator 前缀加重载 value return this countercounter operator int 后缀加重载 countert t value value 普通的后缀加returnt voidmain counterc1 c2 c2 c1 c2 print c2 c1 c2 print c2 c1 c2 print 练习5 2 定义一个颜色类 它有红 绿 蓝三种颜色 分别用无符号整数表示 取值范围为0 255 重载运算符 友元函数 成员函数 在主函数中测试 说明 1 函数返回值问题 countercounter operator 前缀加重载 value return this 因此 有c2 c1 如定义成void或intintcounter operator 前缀加重载 value returnvalue 则调用只能写成 c1 不能作右值 构成赋值语句 反而不直观 对象的值 2 对于countercounter operator int 后缀加重载 countert t value value returnt 定义类 可以作右值 也可以独立表达式 否则使用不直观 不能定义成返回引用 局部变量作用域的原因 3 对于countercounter operator 圆括号重载定义 return this 返回值不能为returnthis value 类型不同returnthis 指针 类型不同 4 如没有前缀运算符重载 则前缀 后缀一样 3 类的转换运算符 对于基本类型的数据具有强制类型转换运算 对于类的必须自己定义强制类型转换运算符 例 将RMB类的对象转换成double的强制运算符定义classRMB public RMB doublevalue 0 0 operatordouble return yuan jf 100 0 转换运算符voiddisplay cout value yuan jf 100 0 endl protected unsignedintyuan unsignedintjf RMB RMB doublevalue 将double转换成类的对象 yuan value jf value yuan 100 0 5 四舍五入 voidmain RMBd1 2 0 d2 1 5 d3 doublev1 v2 v1 double d1 v2 double d2 d3 RMB v1 v2 显式转换d3 display 练习5 3 定义一个日期类 它有年 月 日三个属性值 重载整型强制类型转化运算符 在主函数中测试 小结 1 使用运算符重载可以使程序易于对对象的操作 许多C 的运算符都可以重载 但注意不要重载违反常规的运算符 2 重载不能改变运算符的操作数的个数 也不能发明新的运算符 3 this指针指向当前的对象 是所有成员函数不可见的参数 通过它可以返回对象的值 4 在前增量 后增量运算符重载中 使用int形参只是为了标志前后有别 没有其他作用 四 静态成员静态数据成员提出理由 数据共享 比较全局变量安全性 静态变量 静态函数等例 用链表管理学生信息 链首指针 学生信息数 结点数目 例1 使用静态数据成员的简单程序 classMyclass public Myclass intx inty a x b y voidget num sum a b voidprint sum cout sum sum endl protected inta b staticintsum 私有静态数据成员 intMyclass sum 0 静态数据成员的初始化voidmain Myclassm 3 5 n 10 20 输出结果 m get num m print sum n get num m print sum n print sum 结论 静态数据成员属于类 不属于类的对象 但私有静态数据成员通过成员函数访问 说明 1 静态数据成员在定义时前面加static2 初始化形式 1 在类的外面实现 前面不加static 2 不加成员的访问权限控制符 private public 3 使用作用域符 表明静态数据属于类 不属于对象 见下例 4 其他方式不行 构造函数 冒号方式等 3 静态数据成员 静态生命期4 访问静态数据成员的格式 静态公有数据 classmyclass public staticintb 公用区 与私有区书写性质类似myclass intx inty a x b b y staticvoidprint myclass OK 但不能直接用b 例2 用链表管理学生 classstudent public student char pname student voidprint 打印链的内容protected staticstudent pfirst 静态数据成员student pnext 指向下一个结点charname 20 姓名 student student pfirst NULL 静态数据初始化 student student char pname 构造函数 strcpy name pname 字符串拷贝pnext pfirst 指向原链的首指针pfirst this 当前结点作为链的首 建链的方法 在链头插入新的结点student student 析构函数定义 coutnamepnext if ps pnext this ps pnext pnext return 断开this结点 即删除该点 voidstudent print 打印链的内容 student p pfirst while p coutnamepnext student fn 普通函数 建立两个结点的链 student ps newstudent A1 studentsb B1 returnps voidmain studentsa C1 student sb fn studentsc D1 sc print cout endl deletesb 释放sb对象 程序运行结果 B1D1 A1 C1 A1 D1 C1 结论 1 静态私有数据成员 只能被静态成员函数操作 不能直接通过对象名或其他方式访问 2 静态公有数据成员 可以被静态成员函数操作 可以通过对象名或类的作用域方式直接访问 3 两种静态数据的初始化形式一样 4 静态数据属于类 不管类的对象有多少个 其静态数据成员却只有一个 且被所有对象共享 5 类的对象中包含各自的普通数据成员 但不包括静态数据成员 即静态数据成员不随对象的产生而分配 也不随对象的消失而回收 从而静态数据成员与类的构造函数 析构函数无关 6 静态数据成员的生命期是整个程序 即随程序的开始而产生 随程序的结束而消亡 结束
展开阅读全文
相关资源
相关搜索

当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


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