C++快速入门(二)
C++快速入门(二)
下面介绍一系列 C++ 和面向对象编程技术中的一些比较高级的概念:静态对象和静态方法,虚方法,抽象方法和多态等。
1. 静态属性和静态方法
前面的例子中,使用的都是对象(某个类的实例)来调用方法,每个方法只处理调用它的那个对象所包含的数据,所有的数据都属于同一个对象。
如果我们需要的功能或数据不属于某个特性的对象,而是属于整个类,该怎么办?
假如我们需要统计一下有多少只活的动物,那么就需要一个计数器,每诞生一只就 +1 ,每挂掉一只,就 -1。
首先想到的是使用一个全局变量,但是任何代码都能改变该计数器,这很危险。所以非必要时不要用全局变量。
我们真正需要的是一个只在创建或删除对象的时候才允许访问的计数器。使用 C++ 的静态属性和静态函数才能完美解决。
C++ 允许我们把一个或多个成员声明为属于某个类,而不是仅属于该类的对象。这么做的好处是程序员可以在没有创建任何对象的情况下调用有关的方法。另一个好处是能够让有关的数据仍在该类的所有对象间共享。
创建一个静态属性和静态方法:只需要在它的声明前加上 static 保留字即可。
代码如下:
12345678910 ...
C++快速入门(一)
C++快速入门(一)
C++ 是一门面向对象的语言,即 OO 思想。
1. 程序示例
首先,可以在之后的代码中经常看到 using namespace std; ,这是为了调用一个叫做命名空间的东西。
C++标准库使用的所有标识符(即类、函数、对象等的名称)都是在同一个特殊的名字空间(std)中来定义的。
如果不使用上述声明,则需要在用到每个名字空间中的标识符时,在标识符名称之前加上 std:: 。
1.1 示例一
题目:任意输入数字和空格,返回整数之和。
C 语言实现:
12345678910111213141516171819202122232425#include <stdio.h>int main(void) { int i; int sum = 0; char ch; printf("请输入一串整数和任意数目的空格:"); while ( scanf("%d", &i) == 1 ) { sum += i; while ( (ch = ...
C语言——一些进阶知识(三)
C语言——文件操作相关
1. 打开和关闭文件
对一个文件进行读写后必须对将其关闭。
下面列举所有可使用的打开模式:
模式
描述
“r”
1. 以只读的模式打开一个文本文件,从文件头开始读取2. 该文本文件必须存在
“w”
1. 以只写的模式打开一个文本文件,从文件头开始写入2. 如果文件不存在则创建一个新的文件3. 如果文件已存在则将文件的长度截断为 0 (重新写入的内容将覆盖原有的所有内容)
“a”
1. 以追加的模式打开一个文本文件,从文件末尾追加内容2. 如果文件不存在则创建一个新的文件
“r+”
1. 以读和写的模式打开一个文本文件,从文件头开始读取和写入2. 该文件必须存在3. 该模式不会将文件的长度截断为 0 (只覆盖重新写入的内容,原有的其他内容保留)
“w+”
1. 以读和写的模式打开一个文本文件,从文件头开始读取和写入2. 如果文件不存在则创建一个新的文件3. 如果文件已存在则将文件的长度截断为 0 (重新写入的内容将覆盖原有的所有内容)
“a+”
1. 以读和追加的模式打开一个文本文件2. 如果文件不存在则创建一个新的文件3. 读取 ...
C语言——一些进阶知识(二)
C语言——数据结构相关
1. 高级宏定义
1.1 不带参数的宏定义
1#define PI 3.14
为了和普通变量区分,宏的名字通常约定是全部由大写字母组成
宏定义只是进行简单的替换,编译器不会对宏定义检查语法错误,检查出来也是替换之后的代码报错
宏定义的作用域是从定义的位置开始到整个程序结束
可以用 #undef 来终止宏定义的作用域
1234567891011121314#include <stdio.h>#define PI 3.14int main(void) { int r; float s; scanf("%d", &r);#undef PI // 结束 PI 宏的作用 s = PI * r * r; printf("S = %.2f\n", s); return 0;}
宏定义允许嵌套
1234567891011#include <stdio.h>#define R 6371#define PI 3.14#define ...
C语言——一些进阶知识(一)
C语言——存储相关
1. 局部变量与全局变量
局部变量函数运行结束后即释放。
局部变量会在作用域内屏蔽同名的全局变量。
2. 作用域与链接
2.1 作用域
2.1.1 代码块作用域(block scope)
在代码块中定义的变量,具有代码块作用域。作用范围是从变量定义的位置开始,到标志该代码块结束的右大括号(})处。
尽管函数的形式参数不在大括号内定义,但其同样具有代码块作用域,隶属于包含函数体的代码块。
以前不知道括号有什么用,原来可以用来划分作用域。
1234567891011121314151617181920#include <stdio.h>int main() { // 作用域 1 int i = 1; { // 作用域 2 int i = 2; { // 作用域 3 int i = 3; printf("i = %d\n", i); } { // 作用域 4 ...
计网错题整理
计网错题整理
T1
如图所示网络。A在t=0时刻开始向C发送一个2Mbits的文件;B在t=0.1+e秒(e为无限趋近于0的小正实数)向D发送一个1Mbits的文件。忽略传播延迟和结点处理延迟。
请回答下列问题:
1)如果图中网络采用存储-转发方式的报文交换,则A将2Mbits的文件交付给C需要多长时间?B将1Mbits的文件交付给D需要多长时间?
解:
给路由器从左到右依次编号为1,2
A报文比B报文先到达路由器1
tA→C=2/10+2/20+2/10=0.5st_{A\to C} = 2/10 + 2/20 + 2/10 = 0.5s
tA→C=2/10+2/20+2/10=0.5s
tB→D=1/10+0.1(等待A)+1/20+1/10=0.35st_{B \to D} = 1/10 + 0.1(等待A) + 1/20 + 1/10 = 0.35s
tB→D=1/10+0.1(等待A)+1/20+1/10=0.35s
2)如果图中网络采用存储-转发方式的分组交换,分组长度为等长的1kbits,且忽略分组头开销以及报文的拆装开销,则A将2Mbits的文件交付给 ...
体系结构(四)
第4章 指令级并行
4.1 指令级并行的概念
4.2 指令的动态调度
4.3 控制相关的动态解决技术
4.4 多指令流出技术
目录列出来了,却没复习完,只看了部分循环展开、记分牌和 Tomasulo 。
记分牌:
https://www.bilibili.com/video/BV1JM4y1f7UP/?spm_id_from=333.999.0.0&vd_source=e7300d5accad8932a257efb8871bb9ee
Tomasulo:
https://www.bilibili.com/video/BV1xe4y1c7AK/?spm_id_from=333.999.0.0&vd_source=e7300d5accad8932a257efb8871bb9ee
第5章 存储层次
在冯·诺依曼体系结构下,绝大多数程序访问的指令和数据是相对聚簇的,符合局部性原理。
这一本质特征使得 CPU 近期使用的程序和数据可放在离 CPU 较近的、容量小而速度快的存储器中来满足性能要求,而其他程序和数据可放在离 CPU 较远的、容量大而速度慢的存储器中来满足容量要求 ...
体系结构(三)
第3章 流水线技术
1. 流水线概述
1.1 基本概念
流水线技术具有以下特点:
流水过程由多个相联系的子过程组成,每个过程称为流水线的“级”或“段”。一条流水线的段数,也称为流水线的“深度”或“流水深度”。
每个子过程由专用的功能段实现。
每个功能段所需的时间应尽量相等,否则,时间长的功能段将成为流水线的瓶颈,会造成“堵塞”和“断流”,这个时间一般为一个时钟周期(拍)或机器周期。
流水线需要有“通过时间”(第一个任务流出所需要的时间),在此之后流水过程才进入稳定状态,每一个时钟周期(拍)流出一个结果。
流水线技术适合大量重复的时序过程,只有在输入端能连续地提供任务,流水线的效率才能充分发挥。
1.2 分类
1.单功能流水线和多功能流水线
单功能流水线(Unifunction Piplines):
只能完成一种固定功能的流水线。
多功能流水线(Multifunction Piplines):
流水线各段可以进行不同的连接,从而使流水线在不同的时间,或在同一时间完成不同的功能。
2.静态流水线和动态流水线
静态流水线(Static Pipelines):
在同一时间内,流水 ...
体系结构(二)
第2章 指令系统
2.1 指令系统概述
指令系统是计算机中软件与硬件交界的一个主要标志:
软件设计者利用指令系统编制各种应用软件和系统软件
硬件设计者采用各种手段实现指令系统
2.2 指令系统结构的分类
通用寄存器型指令集结构
CPU 中用来存储操作数的存储单元主要有:
堆栈
累加器
一组寄存器
对于 通用寄存器型指令集结构 ,按 ALU 中操作数的个数和在存储器中的个数分类如下:
通用寄存器型指令集结构可以分为三种类型:
2.3 寻址方式
在通用寄存器型指令集结构中,一般是利用寻址方式指明指令中的操作数是一个常数、一个寄存器操作数,或是一个存储器操作数。
寻址实际上是从形式地址到实际地址的转换。形式地址由指令描述,实际地址也称为有效地址。
有效地址指明是存储器单元的地址或寄存器地址。
两种表示寻址方式的方法:
将寻址方式编码于操作码中,由操作码描述相应的寻址方式。
在指令字中设置专门的寻址字段,用以直接指出寻址方式
物理地址空间的信息如何存放?
上例中,8 个二进制位表示 8 个字节。
2.4 操作数类型和大小
2.5 指令系统 ...
体系结构(一)
第1章 计算机体系结构的基本概念
1.1 计算机体系结构的概念
1.1.1 概念的演变
存储程序计算机,即冯·诺依曼计算机由五个部分组成:
运算器。用于完成数值运算。
存储器。用于存储数据和程序。
输入/输出设备。计算机与外部信息交换。
控制器。对程序完成控制(指令、命令)序列,完成对数据的运算。
①以运算器为中心;②程序(指令)和数据放在同一存储器中
计算机体系结构是程序员所看到的计算机的属性,即概念性结构和功能特性。
1.1.2 计算机体系结构组成和实现
体系结构概念包括计算机系统设计的三个方面:
计算机指令系统:程序员可见的实际指令系统,是计算机系统硬件和软件之间的一个分界面。
计算机组成:又叫微体系结构
计算机硬件:计算机具体的实现技术,包括逻辑设计,集成电路工艺、封装等。
1.1.3 计算机系统中的层次概念
系列机(family machine) 是一个厂家生产的具有相同的体系结构(指令集结构),但组成和实现不同的一系列不同型号的计算机系统。
兼容性:
1.2 计算机体系结构的发展
1. 分布的 I/O 处理能力
2. 并行处理技术的发展
并行性的概念:
...










