第5章  数据的共享与保护

5-7定义一个Cat类,拥有静态数据成员 numOfCats,记录Cat的个体数目;静态成员函数getNumOfCats(),读取numOfCats。设计程序测试这个类,体会静态数据成员和静态成员函数的用法。

#include<iostream>
using namespace std;class cat{public:cat(){numOfCats++;}static int getNumOfCats(){return numOfCats;}~cat(){numOfCats--;}private:static int numOfCats;
};
int cat::numOfCats = 0;  //类的静态成员变量必须在类外进行初始化void numprintf()
{cout<<"There are "<<cat::getNumOfCats()<<" cats alive!"<<endl;
}int main()
{cat a;cat b;cat c;numprintf();cat *t1,*t2;t1=new cat();t2=new cat();numprintf();delete t1;numprintf();return 0;
}

注:静态数据成员numOfCats用来给cat类的对象个数进行计数,其被cat类的所有对象共同维护和使用,数据共享

在类外可通过“类名::静态数据成员标识符”调用静态数据成员,而且类的静态成员变量必须在类外进行初始化,不能在类内进行初始化。

5-11 在一个文件中定义一个全局变量n,主函数main(),在另一个文件中定义函数fn1(),在main()中对n赋值,再调用fn1(),在fn1()中也对n赋值,显示n最后的值。

//main文件
#include<iostream>
using namespace std;#include"fn1.h"  //声明头文件
int n;
int main()
{   n=0;fn1();cout<<"n的值:"<<n<<endl;return 0;
}
//另外建一个名为fn1.h的头文件extern int n;    //声明外部变量n
int fn1()
{n=5;
}

头文件fn1.h里有外部变量n,用extern关键字加以声明,这个外部变量是可以为多个源文件共享的全局变量

PS:main文件中声明需要的文件名称需要和调用的文件名称一致,一一对应,才能调出需要的内容。

5-12 在函数fn1()中定义一个静态变量n,fn1()中对n的值加1,在主函数中,调用fn1()十次,显示n的值。

#include<iostream>
using namespace std;void fun1()
{static int n = 0;   //静态变量n++;cout<<n<<endl;
}int main()
{for(int i = 0 ;i < 10 ; i++){fun1();}return 0;
}

函数fn1()中的静态变量n会保持上一回的值,即使发生调用,也不会为该变量建立新的副本,即每次调用该函数时,不会重复初始化为0,会使用上一次保存的值,该变量会在各次调用之间共享。

5-13 定义类X、Y、Z,函数h(X*),满足:类X有私有成员i,Y的成员函数g(X*)是X的友元函数,实现对X的成员i加1,类Z是类X的友元类,其成员函数f(X*)实现对X的成员i加5,函数h(X*)是X的友元函数,实现对X的成员i加10。在一个文件中定义和实现类,在另一个文件中实现main()函数。

//main文件
#include<iostream>
using namespace std;#include"xyz.h"
int main()
{X d;d.show();Y d1;d1.g(&d);d.show();Z d2;d2.f(&d);d.show();h(&d);d.show();return 0;
}
//另外建一个名为xyz.h的头文件#ifndef XYZ_H
#define XYZ_Hclass X;
class Y
{public:void g(X* p);};
class Z
{public:void f(X* p);};class X
{public:X():i(0){}friend void Y::g(X* p);friend class Z;friend void h(X* p);void show(){cout<<i<<endl;}private:int i;
};void Y::g(X* p)
{p->i++;
}void Z::f(X* p)
{p->i += 5;
}void h(X* p)
{p->i += 10;
}#endif // XYZ_H

代码解释:

  • 头文件“xyz.h”中 #ifndef  #define  #endif条件编译指令用途:防止头文件被多次定义,需用唯一的标识符来标记某文件是否已参加过编译保证头文件中定义的变量不存在重复声明或定义。标识符一般大写来防止与其他变量冲突,便于区分。
  • 友元关系提供了不同类或对象之间的数据共享机制,从字面意思也可以看出来,像“朋友”一样,开了一个绿色通道,让函数g(X*)、f(X*)、h(X*)能访问到类X的私有成员i。
  • 还需要注意的,友元函数并不属于这个类本身,故这个类本身的对象是无法访问到这些友元函数的。
  • 无论是友元函数还是友元类。都不能使用类内的this指针,同时也不可以被继承,如同父亲的朋友不一定是儿子的朋友这个道理。

5-14 定义Boat与Car两个类,二者都有weight属性,定义二者的一个友元函数totalWeight(),计算二者的重量和。

#include <iostream>
using namespace std;class car;
class boat{private:int weight;public:boat(int w){weight = w;}friend int gettotalweight(boat &b, car &c);
};class car{private:int weight;public:car(int w){weight = w;}friend int gettotalweight(boat &b, car &c);
};int gettotalweight(boat &b, car &c){return b.weight+c.weight;
}
int main()
{boat b1(5);car c2(2);cout<<"Totalweight:"<<gettotalweight(b1,c2)<<endl;return 0;
}

PS:

  • 友元函数的形式:只需要在类内对这个函数进行声明,并在之前加上friend关键字。
  • 友元函数gettotalweight的形参boat &b,  car &c,这里&地址符的作用是引用的功能,通过地址改变对象的数据,传引用的好处是省去了复制,节约了空间和时间,提高了效率。
  • 另外,定义友元函数gettotalweight()时需要前向引用声明,声明另一个需要用到的类class car,使编译器知道还有这样一个类,才不会编译错误。

本专栏为本人大二C++课程的习题作业和一些学习经验的分享,供大家参考学习。如有侵权请立即与我联系,我将及时处理。


参考书籍为:C++语言程序设计 第五版 -清华大学出版社- 郑莉,董渊、C++语言程序设计 第五版 -清华大学出版社- 郑莉,董渊(学生用书)

编译环境:Visual Studio 2019、Dev-C++

C++语言程序设计第五版 - 郑莉(第五章课后习题)相关推荐

  1. C++语言程序设计第五版 - 郑莉(第九章课后习题)

    第9章  群体类和群体数据的组织 9-1 编写程序提示用户输入一个班级中的学生人数 n,再依次提示用户输入 n 个人在课程 A 中的考试成绩,然后计算出平均成绩,显示出来.请使用本书第 9 章中的数组 ...

  2. C++语言程序设计第五版 - 郑莉(第二章课后习题)

    第2章  C++简单程序设计 2-25 编写一个完整的程序,实现功能:向用户提问"现在正在下雨吗?",提示用户输入Y 或N.若输入为Y,显示"现在正在下雨.": ...

  3. C++语言程序设计第五版 - 郑莉(第八章课后习题)

    第8章 多态性 8-4 请编写一个计数器 Counter类,对其重载运算符"+". #include <iostream> using namespace std;cl ...

  4. java语言程序设计郑莉课后答案_java语言程序设计 第2版 (郑莉)课后习题答案.doc...

    java语言程序设计 第2版 (郑莉)课后习题答案.doc JAVA语言程序设计第2版郑莉第二章习题答案1什么是对象.类,它们之间的联系答1)对象是包含现实世界物体特征的抽象实体,它反映系统为之保存信 ...

  5. C++语言程序设计第四版郑莉

    C++语言程序设计第四版郑莉--学习笔记 第四章 类与对象 4.3构造函数与析构函数 例4-2 在程序主函数中,3个部分分别给出复制构造函数调用的3种情况. #include <iostream ...

  6. 郑莉版java第三章答案_java语言程序设计(郑莉)第七章课后习题答案.docx

    java语言程序设计(郑莉)第七章课后习题答案.docx 还剩 10页未读, 继续阅读 下载文档到电脑,马上远离加班熬夜! 亲,喜欢就下载吧,价低环保! 内容要点: if (matrix.isTria ...

  7. 郑莉java课后答案,Java语言程序设计(郑莉)第三章课后习题答案

    <Java语言程序设计(郑莉)第三章课后习题答案>由会员分享,可在线阅读,更多相关<Java语言程序设计(郑莉)第三章课后习题答案(10页珍藏版)>请在人人文库网上搜索. 1. ...

  8. C++语言程序设计(第5版 郑莉、董渊)学习笔记(自用~)

    C++语言程序设计 第5版 1.前言 2.内容 第一章 绪论 1.1语言发展 1.1.1 概述 机器语言-->汇编语言-->高级语言(包括C++) 1.1.2 面向对象 结构化程序设计(面 ...

  9. C++语言程序设计(第4版)郑莉练习

    C++练习(持续更新) 教材:c++语言程序设计第四版 [教材习题4_13:定义Circle类并计算面积] [问题描述] 定义一个Circle类,有数据成员radius(半径),成员函数getArea ...

  10. c 语言程序设计第四版郑莉答案,C 语言程序设计郑莉(第4版)

    <C++语言程序设计(在线教学版?第4版)/清华大学计算机系列教材,普通高等教育"十一五"规划教材>针对程序设计的初学者,以面向对象的程序设计思想为主线,以通俗易懂的方 ...

最新文章

  1. Google Guava Collections 使用介绍
  2. java graphics 类_对于 Graphics 类的一点认识(转)
  3. OpenUI5 - SAP开源中的移动大战略
  4. Codeforces 1338E JYPnation (图论)
  5. Qt 如何发送和接收UDP数据报
  6. Problem - 4828 Grids
  7. awk用法小结(作者总结)
  8. 用python批量下载网络图片_python 批量下载网页里的图片
  9. 隐马尔可夫模型python_机器学习中的隐马尔科夫模型(HMM)详解
  10. c语言 dirent,DIR和dirent结构体
  11. Horizontalscrollview
  12. 浅析海量数据处理问题
  13. 统计学三大相关系数之斯皮尔曼(spearman)相关系数
  14. Excel一键给操作内容添加批注作者
  15. jetty 去掉项目名称访问
  16. [转载] 花了三个月终于把所有的Python库全部整理了!祝你早日拿到高薪!
  17. 亿图图示EDraw Max,云的跨端思维导图
  18. 压缩指定大小的BitMap
  19. (转)慈不掌兵、义不养财
  20. 中国电信天翼物联学习总结笔记:SecureCRT的学习

热门文章

  1. Rust 数据内存布局
  2. 2016年4月管理计算机应,2016年4月计算机应用能力题库
  3. 如何将高频噪声从信号中滤除掉?
  4. MySQL优化之——查询
  5. Google天气预报API
  6. 航嘉电源的通病维修方法!!
  7. 超休闲游戏潜龙在渊,《Catwalk Beauty》一鸣惊人
  8. 基于多目标灰狼算法的冷热电综合三联供微网低碳经济 MATLAB 仿真
  9. 计算机网络实训课报告书,计算机网络实训报告
  10. 培训班出身的程序员,和科班程序员有什么区别?