c++知识点总结(不时更新)

【面向对象的概念】

世间万物皆有属性和方法,将这些封装起来就是一个对象,面向对象编程思想总结起来其特点就是封装,继承,多态等,类的实例就是一个对象,类中数据成员,成员函数就是对象的属性和操作,实例关系和继承关系就是对象之间的静态关系,而消息传递就是对象之间的动态关系,多态实现了消息传递时对象的反应动作,面向对象与面向过程不对立,相互补充,面向对象能够解决更多复杂的问题,面向对象编程思想更能适用于大型软件设计系统设计。

【内存分配】

栈区:
存储函数的参数,局部变量,程序的返回地址等,编译器需要的时候会自动分配内存,不需要的时候会自动清除。
堆区:
由程序员分配和释放,若程序员不释放,程序结束时操作系统会释放,分配方式类似于链表,动态分配的内存都是在这里,new,malloc,需要用delete,free来释放。
静态区或者全局区:
静态变量和全局变量都放在这里,程序结束后系统释放,初始化的静态变量和全局变量放在一块,未初始化的放在相邻的另一块区域。
文字常量区:
常量字符串,const类型不允许修改
程序代码区:
存放函数体的二进制代码
参考:http://blog.csdn.net/hairetz/article/details/4141043

【堆和栈的区别】

1.从空间分配角度
在Windows下,栈是向低地址扩展的数据结构,是一块连续的内存的区域,栈顶的地址和栈的最大容量是系统预先规定好的,能从栈获得的空间较小,遍历是从高地址向低地址,有操作系统自动分配并释放,存放函数的参数值,局部变量的值等,其操作方式类似于数据结构中的栈;

堆是向高地址扩展的数据结构,是不连续的内存区域。这是由于系统是用链表来存储空闲内存地址的,自然是不连续的,而链表的遍历方向是由低地址向高地址。堆的大小受限于计算机系统中有效的虚拟内存。由此可见,堆获得的空间比较灵活,也比较大,由程序员分配释放,程序员若不释放,程序结束时操作系统可能会释放回收,new,malloc申请的动态空间都是在这里存储。

2.数据结构区别
栈:先进后出的数据结构;
堆:一棵完全二叉树,分为大顶堆和小顶堆

3.缓存方式区别
栈使用的是一级缓存,通常被调用时处于存储空间中,调用完毕后立即释放;
堆是存放在二级缓存中,生命周期由虚拟机的垃圾回收算法来决定。

【虚函数/纯虚函数】

基类中vitual声明的函数,期望派生类能够重定义的虚函数,在派生类中此函数也是虚函数,vitual关键字在派生类中可以省略。用来实现多态的,纯虚函数的意义是该函数为后代类型提供了可以覆盖的接口,但是这个类中的版本是绝对不会调用,并且这个类不能够创建对象,这个类的存在仅是为了让其他类继承。

【多态】

多态性是指相同的对象收到不同的消息或者不同的对象收到相同的消息时产生的不同的动作,仅用于通过继承而相关联的类型的引用或者指针,c++中,定义为虚函数是基类期盼派生类重定义实现多态的。

【const用法】

const修饰起到保护作用,可以声明变量,指针,函数参数返回值等,它修饰过的就是不能被改变的

【c/c++分配和释放内存区别】

c:
malloc/free,calloc,realloc均为函数
指针名=(数据类型*)malloc(要申请的内存大小sizeof(type))
指针名=(数据类型*)calloc(n,类型大小sizeof(type)),分配n个大小为size的连续内存。
指针名=(数据类型*)realloc(要改变内存大小的指针名,新的大小)

c++:
new/delete 为运算符

malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符。它们都可以用于申请动态内存和释放内存。对于非内部数据类型对象而言,光用malloc/free无法满足动态对象的要求。对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。由于
malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于malloc/free。

【析构函数、构造函数和虚函数关系】

析构函数必须设定为虚函数,构造函数不设为虚函数
http://www.cnblogs.com/alephsoul-alephsoul/archive/2012/12/28/2837976.html
http://www.cnblogs.com/lixiaohui-ambition/archive/2012/07/13/2589716.html#3222778
这两篇讲述为什么如此设定

【const、define区别】

都可以定义常量
const分配内存,编译时进行类型检查,在常量区分配,可进行调试
define 不分配内存,预处理时进行展开,哪有它就哪展开,不进行类型检查,存在类型不安全性,不能进行调试
http://blog.chinaunix.net/uid-22330495-id-200909.html
http://blog.sina.com.cn/s/blog_79b01f6601018xdg.html

【define和inline】

define预处理是替换,inline内联函数有类型检查
http://hexiong26.blog.163.com/blog/static/1312808132010108111911846/

【野指针】

“野指针”不是NULL指针,而是指向“垃圾”的内存指针,其主要成因是:指针变量没有被初始化,或者指针p被free或者delete之后,没有置为NULL

【static用途】
1)在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变。

2) 在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所用函数访问,但不能被模块外其它函数访问。它是一个本地的全局变量。

3) 在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用。那就是,这个函数被限制在声明它的模块的本地范围内使用

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值