数据的共享和保护

对象的生存期

static类型的局部变量,生存期在整个程序,局部可见。

  1. void example()
  2. {
  3. static a=1;
  4. int b=2
  5. }
  6. 当调用完example函数后,b消亡,a仍然存在;
  7. 再次调用该函数时,a值不会再次被赋值,仍保持之前数据;而b需要重新建立,重新赋值。

类的静态数据成员

1.用关键字static声明;

2.为该类的所有对象共享,静态数据成员具有静态生存期;

3.必须在类外定义和初始化,用(::)来指明所属的类.

这个数据属于类的信息,比如统计教师群体中教师的总数,即这个类实例化了多少个对象。

  1. class A{
  2. static int num; //在类内声明
  3. }
  4. int A::num=0; //在类外定义和初始化

类的静态函数成员

1.类外代码可以使用类名和作用域操作符来调用静态成员函数;

2.静态成员函数主要用于处理该类的静态数据成员,可以直接调用静态成员函数;

3.如果访问非静态成员,要通过对象来访问。

  1. class A{
  2. private:
  3. static int num;
  4. int a=1;
  5. public:
  6. static void shownum(){cout<< num << endl;} //2.
  7. static int change(int a);//一个定义的例子;
  8. }
  9. int A::num=0;
  10. int A::change(int a){
  11. A::num=a; //静态数据成员的引用需要加 “类::”来修饰
  12. }
  13. int main(){
  14. A:shownum(); // 1.
  15. }

类的友元

友元是C++提供的一种破坏数据封装和数据隐藏的机制。

友元函数

在类声明中由关键字friend修饰说明的非成员函数,在它的函数体中能

够通过对象名访问 private 和 protected成员

  1. class Point {
  2. public:
  3. Point(int x=0, int y=0) : x(x), y(y) { }
  4. int getX() { return x; }
  5. int getY() { return y; }
  6. friend float dist(Point &a, Point &b);
  7. private:
  8. int x, y;
  9. };
  10. float dist( Point& a, Point& b) //非成员函数
  11. { double x = a.x - b.x; //通过对象名访问私有成员
  12. double y = a.y - b.y;return static_cast<float>(sqrt(x * x + y * y));
  13. }
  14. int main(){
  15. Point p1(1, 1), p2(4, 5);
  16. cout <<"The distance is: ";
  17. cout << dist(p1, p2) << endl;
  18. return 0;
  19. }

友元类

friend声明是单向授权声明,类A是类B的友元,意味着类A获得了访问类B的私有成员的权限,但类B不能反向访问类A的私有成员;

  1. 此处的friend更像是一种"上级声明"
  1. class A {
  2. friend class B;
  3. public:
  4. void display() {cout << x << endl;}
  5. private:
  6. int x;
  7. };
  8. class B {
  9. public:
  10. void set(int i);
  11. void display();
  12. private:
  13. A a; //B类中含有A类成员,正常来说是看不到封装的私有成员的
  14. };
  15. void B::set(int i) { a.x=i; } //因为是友元,所以可以通过对象名访问私有成员
  16. void B::display() { a.display(); }
共享数据的保护
  • 对于既需要共享、又需要防止改变的数据应该声明为常类型(用const进行修饰);
  • 对于不改变对象状态的成员函数应该声明为常函数.

常类型

  • 常对象:必须进行初始化,不能被更新
  1. const 类名 对象名 const A a(1,2);
  • 常成员: 用const进行修饰的类成员:常数据成员和常函数成员
  • 常引用:被引用的对象不能被更新,既增加了效率又避免数据被篡改;常用作形参
  1. const 类型说明符 &引用名 const int &pconst A &p
  • 常数组:数组元素不能被更新(详见第6章)。
  1. 类型说明符 const 数组名[大小]...
  • 常指针:指向常量的指针(详见第6章)。

数组

处理无明显规律的大量同类型数据时,可以通过将其存入数组强制性添加一个次序信息,再结合循环语句,对其进行处理。

  1. a[10]

数组名 a 是一个地址(指针)类型常量,对应数组首元素的内存地址,不能被赋值

数组名作函数参数

  • 形、实参数都应是数组名(实质上是地址),类型要一样,传送的是数组首地址;
  • 对形参数组的改变会直接影响到实参数组.
  1. void rowSum(int a[][4], int nRow)
  2. {
  3. for (int i = 0; i < nRow; i++)
  4. {
  5. for(int j = 1; j < 4; j++)
  6. a[i][0] += a[i][j];
  7. }
  8. }
  9. int table[3][4] = {{1, 2, 3, 4}, {2, 3, 4, 5}, {3, 4, 5, 6}};
  10. rowSum(table, 3);

对象数组

  1. Point a[3];

实例化3个Point类的对象,调用3次构造和3次析构函数;

基于范围的for循环

  • 用来遍历容器类十分方便
  • c++11标准
  1. double prices[5]={4.99, 2.33, 5.86, 6.42, 4.51};
  2. for (double x : prices)
  3. cout<<x<<std::endl;

清华大学《C++语言程序设计基础》线上课程笔记03---数据的共享和保护&数组的更多相关文章

  1. 清华大学《C++语言程序设计基础》线上课程笔记04---指针

    指针 static int i; static int* ptr = &i; 此处的*表示ptr是指针类型(地址类型),用来存放目标数据的地址 其本身也有地址,所以又指向指针的指针; *前面的 ...

  2. 清华大学《C++语言程序设计基础》线上课程笔记02---类与对象

    类与对象 public是类的对外访问接口: 类内初始值 在定义类时对数据成员写初始值,在创建对象的时候,会使用类内初始值初始化数据成员: class Clock { public: void show ...

  3. 清华大学《C++语言程序设计基础》线上课程笔记01---基础概念与一些注意事项

    使用除法的注意事项 double b = 4.0 * 1/239.0; 因为整数相除结果取整,如果参数写1/239,结果就都是0 浮点数注意事项 浮点数是近似存储,所以不能直接比较两个浮点数的大小, ...

  4. 清华大学《C++语言程序设计基础》线上课程笔记05---vector对象,对象的复制与移动,string类

    vector 对象 C++标准库中的一个类模板 封装任何类型的动态数组,自动创建和删除. 数组下标越界检查. 将动态数组封装成类的知识点中封装的ArrayOfPoints也提供了类似功能,但只适用于一 ...

  5. 清华大学《C++语言程序设计进阶》线上课程笔记06---继承、派生、多态性

    类的继承 保持已有类的特性而构造新类的过程称为继承; 实现设计与代码的重用. 在已有类的基础上新增自己的特性而产生新类的过程称为派生 当新的问题出现,原有程序无法解决(或不能完全解决)时,需要对原有程 ...

  6. Python语言程序设计基础(7)—— 文件和数据格式化

    返回字符串 file = input() #返回字符串 fo = open(file,"r").read(6) print(fo) 返回列表形式 file = input() fo ...

  7. 软件工程线上课程(C语言实践篇)学习心得总结

    林牧 + 原创作品转载请注明出处 + <软件工程(C编码实践篇)>MOOC课程http://mooc.study.163.com/course/USTC-1000002006 软件工程的理 ...

  8. C语言程序设计基础-第1周作业-初步

    1.安装带有计算机术语的翻译软件 2.在自己电脑上安装C编译器,windows系统建议安装dev-c++,其他系统自行查找. 3.加入课程小组,有任何疑问可以在小组中提问:https://group. ...

  9. 欢迎参加MVP主讲的Windows 10开发线上课程

    博客地址:http://blog.csdn.net/FoxDave Windows 10 Developer Readiness - Powered by MVPs - 由微软最有价值专家(MVP)主 ...

随机推荐

  1. unity3d项目版本管理设置

    unity3d老是有一堆乱七八糟的文件,好像不提交也不行,特别是那烦人的meta文件,哪到底unity项目提交到版本管理哪些东西可以忽略呢?应该设置些什么东西呢? 菜单,Edit => Proj ...

  2. iOS开发之UIView

    在iPhone里你能看到的.摸到的,都是UIView. 视图坐标系统: UIKit中的坐标都是基于这样的坐标系统:以左上角为坐标的原点,原点向下和向右为坐标轴方向. 坐标值由浮点数来表示,内容的布局和 ...

  3. Web App, Native APP,Hybird App 介绍

    一.Web App 这个主要是采用统一的标准的 HTML,JavaScript.CSS 等 web 技术开发. 用户无需下载,通过不同平台 的浏览器访问来实现跨平台, 同时可以通过浏览器支持充分使用 ...

  4. php反序列化

    之前听漏洞银行的一个女生讲php反序列化.她说了一句.php反序列话找public变量. 导致我以为必须php反序列化.可控的变量必须是public or protected.private私有的变量 ...

  5. 【node】安装

    参考链接: http://www.runoob.com/nodejs/nodejs-install-setup.html http://blog.csdn.net/u010255310/article ...

  6. datetable dt.select使用詳情

    当你从数据库里取出一些数据,然后要对数据进行整合,你很容易就会想到: 1DataTable dt = new DataTable();//假设dt是由"SELECT C1,C2,C3 FRO ...

  7. Azure Blob数据迁移工具

    数据迁移备份,更多的应用场景见https://docs.azure.cn/zh-cn/storage/common/storage-moving-data?toc=%2fstorage%2fblobs ...

  8. 关于ie8下监听input事件的不兼容问题。

    关于在ie8下,监听输入框的值变化的input事件不支持的解决办法: 很懒...直接上原文地址.... 原文地址:http://www.cnblogs.com/lhb25/archive/2012/1 ...

  9. On Java 8中文版 英雄召集令

    这是该项目的GITHUB地址:https://github.com/LingCoder/OnJava8 广招天下英雄,为开源奉献!让我们一起来完成这本书的翻译吧! 如果您在阅读本书的过程中有发现不明白 ...

  10. 将硬件规定的通信协议用Lua实现(涉及到很多Lua通信的数据转换)

    1:这次处理的是大唐的gps通信协议,先简单介绍一下他规定的通信规则: 信息结构: 传输说明: 信息结构中的各个字节书写时都是以十六进制标识,两位数组成.传输时,SOI和EOI(SOI=7EH,EOI ...