Programmers interview book
2015-12-03 23:04
239 查看
第7章 指针与引用
7.1 指针基本问题
1 、关于this指针
(1) this只能在成员函数中使用
全局函数,静态函数都不能使用this,实际上,成员函数默认的第一个参数是T * const
this,由此可见,this在成员函数的开始前构造,在成员的结束后清除,这个声明周期同任何一个函数的参数是一样的,没有任何区别,我们会发现在调用的形式上与静态调用没有什么区别,但区别还是有的,iqi通常会对this指针做一些优化,因此,
this指针的传递效率比较高---如VC通常是通过ecx寄存器传递this参数的
(2) this指针存放在何处?
This指针会因编译器不同而有不同的存放位置,可能是栈,也可能是寄存器,甚至是全局变量,在汇编级别里面,一个值只会以3种形式出现:立即数,寄存器值和内存变量值,不是存放在寄存器就是存放在内存中,它们并不是和高级语言变量对应的
(3) 类在实例化时只分配类中的变量空间,并没有为函数分配空间
(4) 每个类编译后,是否创建一个类中函数表保存函数指针以便用来调用函数?
7.5 迷途指针
1、空指针和迷途指针的区别是什么?
当delete一个指针的时,实际上仅仅是让编译器释放内存,当时指针本身依然存在,这时 它就是一个迷途指针
当使用下列语句时,可以把迷途指针改为一个空指针 MyPtr = 0;
通常在删除一个指针后又把它删除一次,程序会变得非常不稳定,任何情况都可能发生, 但是如果只是删除了一个空指针,则什么事都不会发生,这样做非常安全
使用迷途指针或空指针是非法的,而且有可能造成程序崩溃,如果指针是空指针们尽管同 样是崩溃吗但是它同迷途指针造成的崩溃相比是一种可以预料的崩溃,这样调试起来会方 便很多
2、c++中有了malloc/free,为什么还要new/delete?
Malloc和free是c++/c语言的标准库函数,new与delete是c++的运算符,他们都可以用 于申请动态内存和释放内存
对于非内部数据类型的对象而言,光用malloc与free无法满足动态对象的要求,对象在创 建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数,由于malloc和free 是库函数而不是运算符,不再编译器控制权限之内,不能够把执行狗喊函数和析构函数的任 务强加于malloc与free
因此,c++语言需要一个能完成动态内存分配和初始化工作的运算符new,以及一个能完成 清理与释放内存工作的运算符delete,new与delete不是库函数,而是运算符
添加一点:
malloc/free 和new/delete的区别:
1) new/delete是保留字,不需要头文件支持. malloc/free需要头文件库函数支持. 使用 malloc/free需要包含 #include<cstdlib> 或<stdlib>.
2) new 建立的是一个对象,new会根据对象计算大小,直接返回对象的指针,当使用完毕后 调用delete来释放,但malloc分配的是一块内存,需要用户制定所要分配内存的大小, 而且返回的均为void的指针,使用时需要相应的强制类型转化,使用结束后调用free来 释放内存.
3) new/delete的使用除了分配内存和释放,还调用了类型的构造函数和析构函数,而malloc/free只是简单的分配和释放内存。
7.6 指针和句柄
句柄和指针的区别和联系是什么?
句柄和指针其实是两个截然不同的概念,Windows系统用句柄标记系统资源,用句柄隐藏 系统的信息,只要知道有这个东西存在然后去调研那个就行了,它是一个32bit的uint, 只恨则标记某个物理内存地址,两者是不同的概念。
第8章 循环、递归和概率
待补
第9章 STL模板与容器
普通的类函数(不论是长远函数还是静态函数)都不会创建一个函数表来保存函数指针,只有虚函数才会被放到函数表中
但是,即使是虚函数,如果编译器能明确知道调用的是哪个函数,编译器就不会通过函数表中的指针来间接调用么人是会直接调用该函数
7.5
7.1 指针基本问题
1 、关于this指针
(1) this只能在成员函数中使用
全局函数,静态函数都不能使用this,实际上,成员函数默认的第一个参数是T * const
this,由此可见,this在成员函数的开始前构造,在成员的结束后清除,这个声明周期同任何一个函数的参数是一样的,没有任何区别,我们会发现在调用的形式上与静态调用没有什么区别,但区别还是有的,iqi通常会对this指针做一些优化,因此,
this指针的传递效率比较高---如VC通常是通过ecx寄存器传递this参数的
(2) this指针存放在何处?
This指针会因编译器不同而有不同的存放位置,可能是栈,也可能是寄存器,甚至是全局变量,在汇编级别里面,一个值只会以3种形式出现:立即数,寄存器值和内存变量值,不是存放在寄存器就是存放在内存中,它们并不是和高级语言变量对应的
(3) 类在实例化时只分配类中的变量空间,并没有为函数分配空间
(4) 每个类编译后,是否创建一个类中函数表保存函数指针以便用来调用函数?
7.5 迷途指针
1、空指针和迷途指针的区别是什么?
当delete一个指针的时,实际上仅仅是让编译器释放内存,当时指针本身依然存在,这时 它就是一个迷途指针
当使用下列语句时,可以把迷途指针改为一个空指针 MyPtr = 0;
通常在删除一个指针后又把它删除一次,程序会变得非常不稳定,任何情况都可能发生, 但是如果只是删除了一个空指针,则什么事都不会发生,这样做非常安全
使用迷途指针或空指针是非法的,而且有可能造成程序崩溃,如果指针是空指针们尽管同 样是崩溃吗但是它同迷途指针造成的崩溃相比是一种可以预料的崩溃,这样调试起来会方 便很多
2、c++中有了malloc/free,为什么还要new/delete?
Malloc和free是c++/c语言的标准库函数,new与delete是c++的运算符,他们都可以用 于申请动态内存和释放内存
对于非内部数据类型的对象而言,光用malloc与free无法满足动态对象的要求,对象在创 建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数,由于malloc和free 是库函数而不是运算符,不再编译器控制权限之内,不能够把执行狗喊函数和析构函数的任 务强加于malloc与free
因此,c++语言需要一个能完成动态内存分配和初始化工作的运算符new,以及一个能完成 清理与释放内存工作的运算符delete,new与delete不是库函数,而是运算符
添加一点:
malloc/free 和new/delete的区别:
1) new/delete是保留字,不需要头文件支持. malloc/free需要头文件库函数支持. 使用 malloc/free需要包含 #include<cstdlib> 或<stdlib>.
2) new 建立的是一个对象,new会根据对象计算大小,直接返回对象的指针,当使用完毕后 调用delete来释放,但malloc分配的是一块内存,需要用户制定所要分配内存的大小, 而且返回的均为void的指针,使用时需要相应的强制类型转化,使用结束后调用free来 释放内存.
3) new/delete的使用除了分配内存和释放,还调用了类型的构造函数和析构函数,而malloc/free只是简单的分配和释放内存。
7.6 指针和句柄
句柄和指针的区别和联系是什么?
句柄和指针其实是两个截然不同的概念,Windows系统用句柄标记系统资源,用句柄隐藏 系统的信息,只要知道有这个东西存在然后去调研那个就行了,它是一个32bit的uint, 只恨则标记某个物理内存地址,两者是不同的概念。
第8章 循环、递归和概率
待补
第9章 STL模板与容器
普通的类函数(不论是长远函数还是静态函数)都不会创建一个函数表来保存函数指针,只有虚函数才会被放到函数表中
但是,即使是虚函数,如果编译器能明确知道调用的是哪个函数,编译器就不会通过函数表中的指针来间接调用么人是会直接调用该函数
7.5
相关文章推荐
- ICMP报文
- C/C++程序设计——指针与函数
- C#_字符串拆分Split实例方法
- iOS网络底层之BSD Socket Libra1ry<1>
- 【Android】UnitTest、Android Studio build加速(小结:2015-12-3 22:40:19 )
- 程序猿程序人生
- 网络请求 - Post解析
- IOS 入门之基础控件学习1
- RapidSVN的使用
- Ugly Number II
- iphone开发之旅--环境搭建(1)
- 黑马程序员—javaSE—反射和新特性
- 网络爬虫
- prototype/call
- C#_字符串截取Substring实例方法
- QString简介
- [开发记录][微信]开发者模式验证与基本回复功能
- http://blog.csdn.net/wankunde/article/details/41675079/Spark 学习入门教程
- 后台管理界面-- 登录设计
- 普通二叉树C++实现