清华大学《C++语言程序设计基础》线上课程笔记03---数据的共享和保护&数组
数据的共享和保护
对象的生存期
static类型的局部变量,生存期在整个程序,局部可见。
void example()
{
static a=1;
int b=2
}
当调用完example函数后,b消亡,a仍然存在;
再次调用该函数时,a值不会再次被赋值,仍保持之前数据;而b需要重新建立,重新赋值。
类的静态数据成员
1.用关键字static声明;
2.为该类的所有对象共享,静态数据成员具有静态生存期;
3.必须在类外定义和初始化,用(::)来指明所属的类.
这个数据属于类的信息,比如统计教师群体中教师的总数,即这个类实例化了多少个对象。
class A{
static int num; //在类内声明
}
int A::num=0; //在类外定义和初始化
类的静态函数成员
1.类外代码可以使用类名和作用域操作符来调用静态成员函数;
2.静态成员函数主要用于处理该类的静态数据成员,可以直接调用静态成员函数;
3.如果访问非静态成员,要通过对象来访问。
class A{
private:
static int num;
int a=1;
public:
static void shownum(){cout<< num << endl;} //2.
static int change(int a);//一个定义的例子;
}
int A::num=0;
int A::change(int a){
A::num=a; //静态数据成员的引用需要加 “类::”来修饰
}
int main(){
A:shownum(); // 1.
}
类的友元
友元是C++提供的一种破坏数据封装和数据隐藏的机制。
友元函数
在类声明中由关键字friend修饰说明的非成员函数,在它的函数体中能
够通过对象名访问 private 和 protected成员
class Point {
public:
Point(int x=0, int y=0) : x(x), y(y) { }
int getX() { return x; }
int getY() { return y; }
friend float dist(Point &a, Point &b);
private:
int x, y;
};
float dist( Point& a, Point& b) //非成员函数
{ double x = a.x - b.x; //通过对象名访问私有成员
double y = a.y - b.y;return static_cast<float>(sqrt(x * x + y * y));
}
int main(){
Point p1(1, 1), p2(4, 5);
cout <<"The distance is: ";
cout << dist(p1, p2) << endl;
return 0;
}
友元类
friend声明是单向授权声明,类A是类B的友元,意味着类A获得了访问类B的私有成员的权限,但类B不能反向访问类A的私有成员;
此处的friend更像是一种"上级声明"
class A {
friend class B;
public:
void display() {cout << x << endl;}
private:
int x;
};
class B {
public:
void set(int i);
void display();
private:
A a; //B类中含有A类成员,正常来说是看不到封装的私有成员的
};
void B::set(int i) { a.x=i; } //因为是友元,所以可以通过对象名访问私有成员
void B::display() { a.display(); }
共享数据的保护
- 对于既需要共享、又需要防止改变的数据应该声明为常类型(用const进行修饰);
- 对于不改变对象状态的成员函数应该声明为常函数.
常类型
- 常对象:必须进行初始化,不能被更新
const 类名 对象名 const A a(1,2);
- 常成员: 用const进行修饰的类成员:常数据成员和常函数成员
- 常引用:被引用的对象不能被更新,既增加了效率又避免数据被篡改;常用作形参。
const 类型说明符 &引用名 const int &p;const A &p;
- 常数组:数组元素不能被更新(详见第6章)。
类型说明符 const 数组名[大小]...
- 常指针:指向常量的指针(详见第6章)。
数组
处理无明显规律的大量同类型数据时,可以通过将其存入数组强制性添加一个次序信息,再结合循环语句,对其进行处理。
a[10]
数组名 a 是一个地址(指针)类型常量,对应数组首元素的内存地址,不能被赋值
数组名作函数参数
- 形、实参数都应是数组名(实质上是地址),类型要一样,传送的是数组首地址;
- 对形参数组的改变会直接影响到实参数组.
void rowSum(int a[][4], int nRow)
{
for (int i = 0; i < nRow; i++)
{
for(int j = 1; j < 4; j++)
a[i][0] += a[i][j];
}
}
int table[3][4] = {{1, 2, 3, 4}, {2, 3, 4, 5}, {3, 4, 5, 6}};
rowSum(table, 3);
对象数组
Point a[3];
实例化3个Point类的对象,调用3次构造和3次析构函数;
基于范围的for循环
- 用来遍历容器类十分方便
- c++11标准
double prices[5]={4.99, 2.33, 5.86, 6.42, 4.51};
for (double x : prices)
cout<<x<<std::endl;
清华大学《C++语言程序设计基础》线上课程笔记03---数据的共享和保护&数组的更多相关文章
- 清华大学《C++语言程序设计基础》线上课程笔记04---指针
指针 static int i; static int* ptr = &i; 此处的*表示ptr是指针类型(地址类型),用来存放目标数据的地址 其本身也有地址,所以又指向指针的指针; *前面的 ...
- 清华大学《C++语言程序设计基础》线上课程笔记02---类与对象
类与对象 public是类的对外访问接口: 类内初始值 在定义类时对数据成员写初始值,在创建对象的时候,会使用类内初始值初始化数据成员: class Clock { public: void show ...
- 清华大学《C++语言程序设计基础》线上课程笔记01---基础概念与一些注意事项
使用除法的注意事项 double b = 4.0 * 1/239.0; 因为整数相除结果取整,如果参数写1/239,结果就都是0 浮点数注意事项 浮点数是近似存储,所以不能直接比较两个浮点数的大小, ...
- 清华大学《C++语言程序设计基础》线上课程笔记05---vector对象,对象的复制与移动,string类
vector 对象 C++标准库中的一个类模板 封装任何类型的动态数组,自动创建和删除. 数组下标越界检查. 将动态数组封装成类的知识点中封装的ArrayOfPoints也提供了类似功能,但只适用于一 ...
- 清华大学《C++语言程序设计进阶》线上课程笔记06---继承、派生、多态性
类的继承 保持已有类的特性而构造新类的过程称为继承; 实现设计与代码的重用. 在已有类的基础上新增自己的特性而产生新类的过程称为派生 当新的问题出现,原有程序无法解决(或不能完全解决)时,需要对原有程 ...
- Python语言程序设计基础(7)—— 文件和数据格式化
返回字符串 file = input() #返回字符串 fo = open(file,"r").read(6) print(fo) 返回列表形式 file = input() fo ...
- 软件工程线上课程(C语言实践篇)学习心得总结
林牧 + 原创作品转载请注明出处 + <软件工程(C编码实践篇)>MOOC课程http://mooc.study.163.com/course/USTC-1000002006 软件工程的理 ...
- C语言程序设计基础-第1周作业-初步
1.安装带有计算机术语的翻译软件 2.在自己电脑上安装C编译器,windows系统建议安装dev-c++,其他系统自行查找. 3.加入课程小组,有任何疑问可以在小组中提问:https://group. ...
- 欢迎参加MVP主讲的Windows 10开发线上课程
博客地址:http://blog.csdn.net/FoxDave Windows 10 Developer Readiness - Powered by MVPs - 由微软最有价值专家(MVP)主 ...
随机推荐
- CAGradientLayer实现图片渐变透明效果
CAGradientLayer实现图片渐变透明效果 要实现的效果如下: 源码: // // RootViewController.m // CAGradientLayer // // Copyrigh ...
- itertools 迭代
itertools模块提供的全部是处理迭代功能的函数,它们的返回值不是list,而是Iterator,只有用for循环迭代的时候才真正计算. >>> import itertools ...
- LVS跨网段DR模式并使用ldirectord实现RS高可用性
DR模型的工作过程: Client向VIP发起请求,请求被路由器接收到,转发给不同网段的Director的VIP,Director再通过私有网络转给RS服务器,RS服务器处理请求并通过自身配置的VIP ...
- 深入浅出SharePoint——Caml快速开发
适用于Visual Studio 2010的Caml智能感知工具 http://visualstudiogallery.msdn.microsoft.com/15055544-fda0-42db-a6 ...
- Linux基础入门 - 2
第三节 用户及文件权限管理 3-1.Linux用户管理 Linux 是一个可以实现多用户登陆的操作系统,他们共享一些主机的资源,但他们也分别有自己的用户空间,用于存放各自的文件.但实际上他们的文件都是 ...
- Scala隐式转换和隐式参数
隐式转换 Scala提供的隐式转换和隐式参数功能,是非常有特色的功能.是Java等编程语言所没有的功能.它可以允许你手动指定,将某种类型的对象转换成其他类型的对象或者是给一个类增加方法.通过这些功能, ...
- 我的第一个 Servlet
简单记录一下我从头写一个 Servlet 的过程. 我安装的是 Tomcat 7 版本,在 Ubuntu 18.04 上运行,IDE 为 Intellij IDEA. 首先创建一个 Java Web ...
- 【[JSOI2009]火星藏宝图】
这里是\(sb\)的\(O(nm)\)做法 上一篇题解里写的\(O(nm)\)做法并没有看懂,我真是好菜啊 这是一个用了斜率优化,但是复杂度仍然是\(O(nm)\)的做法 我们还是先写出简单的\(dp ...
- python沙箱逃逸的几道题
第一道 from __future__ import print_function print("Welcome to my Python sandbox! Enter commands b ...
- gulp基础使用及进阶
提示:路径中不允许出现中文,否则scss编译会出错,大概. 按照惯例,先检查一下Node.js.npm(cnpm).gulp的版本号 1.新建package.json 我们可以通过手动新建这个配置文件 ...