c++编程入门1 面向对象基本概念与二进制相关知识点
1.面向对象的几个基本概念
1).对象:
1.每个对象都是描述客观存在事物的一个实体,是由数据和方法(属性和行为)构成
2.属性是描述事物特征的数据
3.行为描述对对象属性的一些操作。
2).类:
1.类是具有相同属性和行为的一些对象的集合,它为所有属于这个类的对象提供抽象的描述
类的三个重要性质:
3).封装:
1.也就是把客观的事物封装成抽象的类,并且类可以把自己的属性方法只让可信的类和对象操作 对不可信的隐藏内部细节
4).继承:
基类(父类)、派生类(子类)
派生类可以通过继承父类来拥有父类的所有属性和行为
5).多态:
1.指在一般类中定义的属性和行为,被特殊类继承后,可以拥有不同的数据类型或表现出不同的行为,这使得同一个属性或行为在一般类及其各种特殊类中拥有不同的语义。
2.多态包含(重载、覆盖、引用)
6).重载:
方法(函数)的重载:
1.在同一作用域中,方法名相同,但形参列表不同(个数,类型,顺序),我们称之为函数重载
2.无法以返回类型作为重载函数的区分标准
3.main函数不能重载
#include<iostream> #include<string> using namespace std; struct name{ string str; }; struct Phone{ string tel; }; void lookup(name n){ cout << n.str << endl; } void lookup(Phone phone){ cout << phone.tel << endl; } int main(){ Phone phone; phone.tel = "123456778910"; name n; n.str = "zhangsan"; lookup(phone); lookup(n); system("pause"); return 0; }
运算符重载:
7).覆盖(重写):
1.就是面向对象中的多态,派生类的方法覆盖基类的方法,以实现不同的功能,或者对基类的功能进行扩充。
2.方法名相同,参数相同,返回类型相同, 方法的权限不能比父类小(例如:父类中为 public 子类中不能为 private)
#include<iostream> using namespace std; class father{ public: void f(int a); }; void father::f(int a){ // ::为作用域运算符 cout << "i am father" << " "<< a << endl; } class son :public father{ // :为继承运算符 public: void f(int a); }; void son::f(int a){ cout << "i am son" << " "<<a << endl; } int main(){ father fa; fa.f(5); system("pause"); return 0; }
8).抽象类:
1.抽象类是包含抽象方法的类(java) 纯虚函数(c++),抽象方法只有方法头没有方法体,关键字为 abstract(java) virtual(c++).
2.抽象类不能实例化(不能建立抽象类对象),只能作为父类
3.抽象类不能用作参数类型、函数返回类型或显式转换的类型。
4.可以定义指向抽象类的指针和引用,此指针可以指向其它的派生类,进而实现多态性。
9).接口:
关键字 interface(接口) implement(实现 java)
1.在C++中,通过类实现面向对象的编程,而在基类中只给出纯虚函数的声明,然后通过在派生类中实现纯虚函数的具体定义的方式来实现接口,
2.不同派生类实现接口的方式也不尽相同,从而实现多态.
3.接口中的方法全为抽象方法
4.子类可以实现多个接口
2.进制之间的转化
1).R进制转化为十进制:
按权展开求和
for example :
11.01(二进制) = 1×2^1 + 1×2^0 + 0×2^(-1) + 1×2^(-2) = 3.25
2).十进制转化为R进制:
要将数的整数部分和小数部分分别进行转换,分别按除r取余数和乘r取整数两种不同的方法来完成。
先得到的余数为结果的低位,先得到的整数为小数的高位
3.)二进制和八进制十六进制之间怎么转换:
每位八进制相当于三位二进制,每为十六进制相当于四位二进制
3.计算机数据的存储单位
位、字节、字
1).位:
这是数据的最小单位,表示一位二进制数据
2).字节:
由八位二进制数据组成,字节是数据存储中最常用的基本单位,1k等于1024字节。
3).字:
位的组合,作为一个独立的信息单位处理。取决于机器的类型、字长及使用者的要求。
常用的固定字长有8位、16位、32位。
4).机器字长:
讨论信息单位时,有个与机器硬件指标有关的单位就是机械字长, 一般指参与运算的寄存器所含有的二进制的位数,它代表了机器的精度,如32位、64位等。
4.原码、反码与补码
计算机存储数据信息都是以二进制编码存储的,计算机要使用一定的编码方式进行存储,原码,反码,补码是机器存储一个具体数字的编码方式。
1).原码:
最高位是符号位,后面数为要表示数的绝对值,符号位放在数的最高位,0表示正号 1表示负号。其中存在一个问题:0的表示不唯一
2).反码:
正数的反码和原码一样,负数的反码的符号位和原码一样,但其他位取反
for example:
二进制+1100111的原码为 01100111,反码也为 01100111
二进制-1100111的原码为 11100111,反码为 10011000
4).补码:
正数的补码、反码、原码一致,负数的补码是其反码的最末尾加1得到,即负数的补码为负数的原码:符号位不变其余取反再加一
为何要使用原码,反码,补码?
1). 原码计算存在问题:
计算机辨别符号位会让计算机的基本电路设计变得十分复杂,于是将符号位也参与运算,根据减去一个正数等于加上一个负数 即 1-1=1+(-1)=0 ,所以机器可以只有加法没有减法。
计算十进制的表达式:1-1=0
1-1=1+(-1)=[00000001]原+[10000001]原=[10000010]原=-2
显然结果不正确。
2). 反码的出现:
为了解决原码做减法的问题,出现了反码
计算十进制的表达式:1-1=0
1-1=1+(-1)=[0000 0001]原+[1000 0001]原=[0000 0001]反+[1111 1110]反=[1111 1111]反=[1000 0000]原=-0
发现反码计算减法,真值部分是正确的,但是唯一的问题是"0"这个特殊的数值上,[0000 0000]原 和 [1000 0000]原 两个编码都是0
3). 补码的出现:
补码的出现解决了0的符合以及两个编码的问题
1-1=1+(-1)=[0000 0001]原+[1000 0001]原=[0000 0001]补+[1111 1111]补=[0000 0000]补=[0000 0000]原=0
4). 原码与补码的取值范围:
这样0用[0000 0000]原 表示,可以用[1000 0000]表示-128
(-1)+(-127)=[1000 0001]原 + [1111 1111]原 = [1111 1111]补 + [1000 0001]补 = [1000 0000]补
在补码运算结果中[1000 0000]补 就是-128 但注意因为实际上是使用以前-0的补码来表示-128,所以-128并没有原码与反码 使用补码不仅仅修复了0的符号以及两个编码的问题,而且多出一个最低数,这就是为什么8位二进制使用原码或者反码表示的范围为[-127,+127] 而使用补码表示的范围为[-128,+127]
因为机器使用补码, 所以对于编程中常用到的32位int类型, 可以表示范围是: [-231, 231-1] 因为第一位表示的是符号位.而使用补码表示时又可以多保存一个最小值.
1).同余的概念:
两个整数a,b,若它们除以整数m所得的余数相等,则称a,b对于模m同余,记作 a ≡ b (mod m);
2).负数取模:
首先取模的数学定义为 x mod y = x- y* (x/y)的下界 (y!=0)
实现用正数替代负数
证明过程:需要用到同余数的两个定理:
1.反身性 a ≡ a (mod m)
2.线性运算定理:
如果:a ≡ b (mod m),c ≡ d (mod m)
那么: (1)a ± c ≡ b ± d (mod m) (2)a * c ≡ b * d (mod m)
现在我们为一个负数找到它的正数同余数
for example 7 -2 ≡ 7 + 10 (mod 12)
对于8位二进制 MOD=2^8
5.浮点数的存储方式:
浮点数N的科学表示法: N=sign*M*2^E (M和E都是二进制表示)
for example: 5.0(十进制浮点数)=101.0(二进制)=1.01* 2^2 (sign为0,M为1.01,E为2)
1.sign称为N的符号位
2.E称为N的阶码(指数位),它的位数反应了浮点数的范围
3.M表示N的全部有效数字(尾数部分) (M大于等于1 小于2 因为M为二进制)
4.浮点数的存储格式与机器有关,如果机器是32位机,其二进制浮点数的组成为1位符号位、8位阶码、23位尾数
种类-------——符号位-------------——指数位----------------尾数位----
float---———第31位(占1bit)---第30-23位(占8bit)----第22-0位(占23bit)
double--——第63位(占1bit)---第62-52位(占11bit)---第51-0位(占52bit)
5.取值范围主要看指数部分:
float的指数部分有8bit(2^8),由于是有符号型,所以得到对应的指数范围-128~128。无符号型指数范围为0~255
double的指数部分有11bit(2^11),由于是有符号型,所以得到对应的指数范围-1024~1024。无符号指数范围为0~2047
由于float的指数部分对应的指数范围为-128~128,所以取值范围为: -2^128到2^128,约等于-3.4E38 — +3.4E38
6.精度(有效数字)主要看尾数位
7.浮点数(32位)的取值范围
float的指数部分有8bit(2^8),由于是有符号型,所以得到对应的指数范围-128~127。
在这8位里同样使用最高位为符号位。
10000000 为最小值 -128
01111111 为最大值 +127
正数中float能取到最小值是
0 10000000 00000000000000000000000 2^-128=3.4×10^-38
能取到的最大值是
0 01111111 11111111111111111111111 2×2^127=3.4×10^38
所以正数范围是3.4×10^-38 ~ 3.4×10^38
对于负数范围是-3.4×10^38 ~ -3.4×10^-38
2018-09-19