运算符优先级
!> 算术运算符 > 关系运算符 > (&& ||)> 条件运算符> 赋值运算符 > 逗号运算符
库引用
include ""是先从本地目录开始寻找,然后去寻找系统路径,而Include <> 相反先从系统目录,后从本地目录。比如:
- 当用#include“file.h”时,先搜索当前工作目录,如果没有,再去搜索标准库,库没有再搜索资源库;
- 当用#include<file.h>时,编译器先从标准库开始搜索,如果没再搜索资源库目录,若还未找到则搜索当前工作目录。
类
抽象类不能被实例化,但是可以存在抽象类指针指向子类。
模板类的继承包括四种:
- 1.(普通类继承 模板类 )
- 2.(类模板继承了普通类(非常常见))
- 3.(类模板继承类模板)
- 4.(类模板继承 模板类,即继承模板参数给出的基类)
注:模板类是类模板的一个实例。即,类型参数具体化。
多态
多态主要以两种形式,静态多态和动态多态。
静态多态主要实现了函数重载和运算符重载。
动态多态主要实现了虚函数。虚函数是动态联编,程序在运行的过程中确定调用哪一个函数。
重载
函数重载的条件是:函数名相同,参数类型或者个数不同,返回类型不能视为重载。
宏和函数
先说宏和函数的区别:
- 1.宏做的是简单的字符串替换(注意是字符串的替换,不是其他类型参数的替换),而函数的参数的传递,参数是有数据类型的,可以是各种各样的类型.
- 2.宏的参数替换是不经计算而直接处理的,而函数调用是将实参的值传递给形参,既然说是值,自然是计算得来的.
- 3.宏在编译之前进行,即先用宏体替换宏名,然后再编译的,而函数显然是编译之后,在执行时,才调用的.因此,宏占用的是编译的时间,而函数占用的是执行时的时间.
- 4.宏的参数是不占内存空间的,因为只是做字符串的替换,而函数调用时的参数传递则是具体变量之间的信息传递,形参作为函数的局部变量,显然是占用内存的.
- 5.函数的调用是需要付出一定的时空开销的,因为系统在调用函数时,要保留现场,然后转入被调用函数去执行,调用完,再返回主调函数,此时再恢复现场,这些操作,显然在宏中是没有的.
内联函数与宏的区别:
- 1.内联函数在运行时可调试,而宏定义不可以;
- 2.编译器会对内联函数的参数类型做安全检查或自动类型转换(同普通函数),而宏定义则不会;
- 3.内联函数可以访问类的成员变量,宏定义则不能;
- 4.在类中声明同时定义的成员函数,自动转化为内联函数。
静态成员
静态成员数据是属于类的,类的所有对象共享。
静态成员依赖于类而不是对象。
静态成员数据视作全局变量。
数据类型
float型数据通常用IEEE754单精度浮点数格式表示:(32位)
三部分组成:符号位、阶码、尾数;
1.符号位:第31位(0-31)正数--0 负数--1
2.阶码:第30位----第23位(共8位)
计算:将实数转化为二进制的指数表示形式,形如 a*2^n;a的取值范围应在在1~2之间,阶码 = n + 127,最后将其表示成二进制形式
3.尾数:第22位----第0位
上述参数a的小数部分为尾数部分
示例: -8.25:
1.符号位 = 1;
2. (8.25) 10 = (1000.01) 2 = 1.000 01 * 2^3; n = 3 阶码 = 3+127 = (130) 10 = ( 100 0001 0) 2
3.尾数 : 000 0100 0000 0000 0000 0000
最终结果 : 1100 0001 0000 0100 0000 0000 0000 0000
1 100 0001 0 000 0100 0000 0000 0000 0000
符号位 阶码 尾数
const
* (指针)和 const(常量) 谁在前先读谁 ;*象征着地址,const象征着内容;谁在前面谁就不允许改变。
常量指针:指向的地址可以变,但内容不可以重新赋值,内容的改变只能通过修改地址指向后变换。
指针常量:指向的地址不可以重新赋值,但内容可以改变,必须初始化,地址跟随一生。
struct
C++中的struct对C中的struct进行了扩充,它已经不再只是一个包含不同数据类型的数据结构了,它已经获取了太多的功能。
struct能包含成员函数吗? 能! struct能继承吗? 能!! struct能实现多态吗? 能!!!既然这些它都能实现,那它和class还能有什么区别?
最本质的一个区别就是默认的访问控制:
默认的继承访问权限
struct是public的,class是private的。