目录
指针和引用的区别:
1.指针是一个变量,存储的是地址。引用是一个别名,和原变量是同一个东西;
2.指针可以有多级,引用只有一级;
3.指针可以为空,引用不能为空且必须在定义时初始化;
4.指针在初始化后可以改变指向,引用初始化后不可以改变;
5.sizeof指针得到的是本指针的大小,sizeof引用得到的是引用所指向变量的大小;
6.当把指针作为形参传递时,实际是把实参拷贝后传递给形参,两者指向地址相同,但不是同一个变量,函数中改变变量指向不影响实参,但引用却可以;
7.指针占空间(32位占4字节空间,64位占8字节空间),引用不占空间;
8.指针可以先声明,用时在初始化,引用必须声明时就初始化;
9.指针可以重新指向别的变量,引用一旦初始化就不可改变(变量可以被引用多次,但引用只能作为一个变量引用);
10.存在空指针,不存在指向空值的引用,引用必须有实体。
堆和栈的区别:
1.申请方式不同
栈是系统自动分配,堆是自己申请和释放的;
2.大小不同
栈的大小固定,堆的大小可变。栈windows下为1M,linux下为8M。堆一般为1G-4G;
3.申请效率不同
栈是系统分配,速度快,不会有碎片;
堆由程序员分配,速度慢,会有碎片。
4.内存管理机制不同
堆是通过链表实现,有专门记录空闲空间的链表,当系统收到申请时,遍历链表寻找第一个大于申请内存的堆节点,删除该节点并将空间分配给程序。
只要栈空间够,就分配,不够就报栈溢出。
5.空间大小
堆是不连续的内存区域;
栈是连续的内存区域;
6.生长方向
堆向上,向高地址方向增长
栈向下,向低地址方向增长
new/delete与malloc/free的异同:
相同点:
都可以用于内存的申请与释放
不同点:
1.前者是C++运算符,后者是标准库函数
2.new自动计算需要分配空间的大小,malloc需要手动计算
3.new是类型安全的,malloc不安全
struct与class区别:
相同点:
1.两者都有成员函数、共有私有部分
2.class可以实现的,struct也同样可以实现
不同点:
1.struct默认共有,class默认私有
2.struct默认public继承,class默认private继承
union与struct的区别:
union是内存共享。
1.union大小取决于最长成员的长度,struct取决于所有成员长度之和;
2.union在任何同一时刻,只存放了一个成员,struct任何时刻所有成员都存在,且各自都占有空间;
3.union对于不同成员赋值时,原成员会被覆盖,struct不同成员间赋值是互不影响的。
struct在C++与C中的区别:
1.C语言中struct是用户自定义类型;C++中是抽象数据类型,支持成员函数定义(能继承,能实现多态)
2.C语言中struct没有设置访问权限,struct中只能是一些变量的集合体,可以封装但不可以隐藏数据,成员不可以函数;C++中设置了访问权限,默认为public(为了和C语言兼容),成员可以有函数;
3.struct作为类的一种特例是用来自定义数据结构的。一个结构标记声明后,在C中必须在结构标记前加上struct,才能做结构类型名(除:typedef struct class{};);C++中结构体标记(结构体名)可以直接作为结构体类型名使用,此外结构体struct在C++中被当作类的一种特例。
define宏定义与const的区别:
1.编译阶段
define是在预编译阶段起作用,而const是在编译运行阶段起作用。
2.安全性
define只是替换,不做类型检查,容易产生错误;
const常量有数据类型,编译器可以做类型检查。
3.内存占用
define是进行替换,内存中会有许多的相同备份,const在运行中只有一份备份,能将复杂表达式计算出结果放入常量表中;
define属于文本替换,不分配内存空间,const修饰常量值不能改变但是要分配空间;
C++中const与static的作用:
static
不考虑类的情况:
1.隐藏,不加static的全局变量以及成员函数具有全局可见性,可以在其他文件中使用,加static之后就只能在该文件的所在编译模块使用。
2.默认初始化为0;
3.静态函数在函数内定义,始终存在,只能进行一次初始化,具有记忆性,作用域与局部变量相同,函数结束后静态变量仍然存在,但是不能使用。
考虑类的情况:
1.static成员变量只与类关联,不与类的对象关联。定义时需要分配空间,不能在类声明中初始化,必须在类定义体外初始化,初始化时不需要标识为static;可以被非static的成员函数任意访问;
2.static成员函数没有this指针,无法访问类对象的非static成员变量以及成员函数,不能被声明为const、虚函数以及volatile。可以被非static成员任意访问;
const
不考虑类的情况:
1.const常量在定义时必须初始化,初始化之后无法更改。
2.const形参可以接受const和非const类型的实参。
考虑类的情况:
1.const成员变量不能在类定义外部初始化,只能通过构造函数初始化列表初始化,必须要有构造函数。不同类对于const成员的值可以不同,所以不可以类中声明时初始化。
2.const成员函数:const对象不可以调用非const成员函数,而可以调用任何非const对象;