C++ 各种关键字以及概念间的区别

指针和引用的区别:

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对象;

未完…

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值