1.new申请对堆空间,方括号里必须是整型,
int * p =new int [10] () 加括号全部初始化为0
int * p =new int [10] {1,2,3,4,5} 加大括号按位置初始化
动态分配一个空数组是合法的 char *p =new char[0] (合法)
释放动态数组,delete[]p 是销毁数组中的元素,倒序销毁
普通类型的释放 加不加 [ ] 都能释放掉,但是在类中 释放对象的时候,不加[ ],只会释放第一个对象
剩余对象会泄露掉
总结:new 和 delete 是关键字 malloc和free是函数
在类中使用new和delete会自动调用构造和析构函数 在释放多个对象的时候注意加 [ ]
2.函数重载: a.相同作用域下
b.函数名称相同
c.参数不同 (多态性) 名称粉碎机制,给函数修改成了不同的名字
3.默认参数:定义的规则必须是从右到左,连续的赋值
4.引用:引用必须初始化,并且不能修改
引用与指针的区别:
引用访问变量是直接访问,而指针是先保存变量地址,间接访问
引用是一个变量的别名,它不单独分配自己的内存空间,但是指针有自己的内存空间
5.iostream是istream和ostream派生而来
而cout是ostream类对象 cin是istream的类对象
6. 面向对象的三大特性:封装,继承,多态 ( 考试必考,亲测 :) )
7.类的大小有其数据成员所占空间和决定 空对象的大小为1 (也就是所谓的空类,编译器会隐士生成6个成员)
8.静态成员变量和静态成员函数:
静态成员变量属于类共享,不属于对象独有,我们可以通过对象去访问他们
静态成员函数:首先说明:静态成员函数属于类,不属于任何对象! 因此静态成员函数就不能是虚函数 虚函数属于对象所有!
成员变量和虚函数都属于对象创建出来,那么既然静态成员函数不是对象所有,那么静态成员函数内部就不能直接去访问类中的成员变量。只能通过在静态成员函数里面通过对象去访问
9.构造函数与析构函数,调用顺序:先创建继承的构造,在类中成员变量的构造,最后自己的构造,析构顺序刚好相反
10.构造函数赋值顺序,参数列表里面写的顺序没有讲究,但是赋值的顺序,是类中定义的顺序赋值,先给第一个变量赋值,如果第一个变量的值是后面成员变量的值,他就为0ffffff 对象成员的构造顺序只和定义顺序有关,和初始化列表顺序无关
11. 初始化列表中必须要有的:我们如果定义了成员变量中有const类型的成员,或者引用类型的成员,我们就必须在初始化列表中去初始化它!!因为他们是一经定义则必须初始化的,并且后面不能修改 。类中其他类的对象,如果有构造函数,则必须在初始化列表中出给他们初始化
12。如果基类是纯虚类,那么子类中必须去实现基类的纯虚函数,如果没有实现,那么子类也就默认称为纯虚类
13.重载,重写,重定义
重载:相同作用域,函数名相同,参数不同
重写:不同作用域,函数名相同,参数相同,基类函数必须要有virtual关键字 (虚继承的时候)
重定义:不同作用域,(函数名相同,参数相同的时候,没有virtual关键字) 函数名相同,参数不同,virtual可有可无
14.析构函数为什么能称为虚函数?( 必考)
基类指针指向子类对象,是多态常见的做法,那么delete基类指针去释放空间,也是常见的做法,但是在这里,delete基类指针只会调用基类的析构函数,子类的析构函数不会被调用,所以子类的内存可能会发生泄露,所以在这里,将基类的析构函数,设置为虚函数,delete基类指针时,会同时调用派生类的析构函数
15.什么函数不能是虚函数:构造函数,内联函数,友元函数,静态函数
也就是只有是成员函数才能称为虚函数,成员函数怎么来,靠类对象创建出来,这也就说明了 我们如果让构造函数为虚函数,类对象还没有创建出来,我们就让构造函数为虚函数,明显不对,只有调用了构造函数,才会创建出来对象
16.函数模板是一组函数的描述,它不是一个实实在在的函数,表示每次它能单独处理在类型形式参数中说明的数据类型, 编译器不会为其产生代码
17.const问题:int const * p int * const p
const在*的左边就代表我们可以修改指针指向对对象,但是不能修改它的值
const在*的右边就代表,我们只能指向一个对象,不能更改指向对象,但是我们可以修改它的值
18.友元函数的声明只能在类的内部,至于定义可以在类内,也可以在类外,他就是一个普通的函数,它不属于类,也不属于对象
19. 运算符重载 自增运算符 前置++ 参数列表中没有值 后置++ 函数的参数列表(int)
单目运算符为成员函数 双目运算符为友元函数
20. C++捕获异常机制,try后面紧跟catch 中间不能有其他语句 一个try可以跟多个catch 但是多个try不能跟一个catch
21. 格式控制符 %md 右边对齐数字 不足的位 左边补空格
%-md 反之,左边补齐,不足的右边补齐 (m为要输入几位)
当然%ms 和 %-ms 也遵循上面原则
22.位运算符操作:按位与: 0 & 0 =0 1&0=0 0&1=0 1&1=1
按位或: 0 | 0 = 0 1|0=1 0|1=1 1|1=1
按位异或 0^0=0 1^0=1 0^1=1 1^1=0
正数负数移位的时候
正数比较简单,左移右移都是补0
负数:移动之前先对其二进制位取反+1,然后在符号位不变,左移右边补0,右移 左边补1。 移动完后再取反+1
23.枚举写的时候注意格式
enum DIR
{
up,
down,
left,
right //最后一个不用写逗号
};//不要忘记分号
默认从0开始 所以 up=0,down=1,left=2,right=3
如果 up=45,则 down =46,left=47,right=48
... 如果 up=56 则down =57 但是如果指定left=88,right就是89 (必考)