1. <span style="font-size:18px;">我们从实验中去总结问题
  2. 测试一: virtual 函数和non-virtual函数
  3. 01.#include <stdio.h>
  4. 02.class A
  5. 03.{
  6. 04.public:
  7. 05.      void function(){printf("Hello World");}  //无virtual关键字
  8. 06.
  9. 07.};
  10. 08.
  11. 09.class B
  12. 10.{
  13. 11.public:
  14. 12.      virtual void function(){printf("Hello World");}
  15. 13.};
  16. 14.
  17. 15.int main( )
  18. 16.{
  19. 17.      A* p1 = NULL;
  20. 18.      p1->function();  //正常运行
  21. 19.
  22. 20.      B* p2 = NULL;
  23. 21.      p2->function();  //crash,Why?
  24. 22.  Return 0;
  25. 23.};
  26. 测试结果:18行正常,21行crash。
  27. 为什么18行正常,21行死机呢?
  28. 其原因是:
  29. 每一个非虚成员函数实际上都等同于一个普通的C函数,其中第一个参数为对象指针,即我们常说的this指针。例如:
  30. 上面的A的function函数实际等同于:<span style="color:#ff0000;">A::Function()  ç==================èFunction(A*this);
  31. </span>与此不同,对每一个虚成员函数的调用都是通过虚函数表的虚指针vptr来进行调用的,如上面的p2->function一句将被编译器解释为:
  32. (* p2->vptr[1] )(p2)
  33. 很容易理解,虚函数的调用是动态决定的。也很容易理解,21行crash,18行正常。很显然,如果在A类的成员函数function里,有去使用成员变量,该函数同样会crash.
  34. <img alt="" src="https://img-my.csdn.net/uploads/201208/03/1343961187_7766.jpg">
  35. 我们再来看看测试二:关于C++ static 成员函数
  36. #include"stdio.h"
  37. #include"stdafx.h"
  38. #include<stdio.h>
  39. class A
  40. {
  41. public:
  42. void function(){ printf("Hello World");}
  43. static A* instance();
  44. A();
  45. };
  46. static A *Test1 =NULL;
  47. A::A()
  48. {
  49. Test1 = this;
  50. }
  51. A* A::instance()
  52. {
  53. return Test1;
  54. }
  55. int main( )
  56. {
  57. A *StackObj = new A;
  58. delete StackObj;//Don’t set it to null intentionally….
  59. while(StackObj  && StackObj->instance() )
  60. {
  61. printf("Error--->%d.\n",StackObj);
  62. }
  63. return 0;
  64. };
  65. Static函数没有this指针,可以认为他就是普通的c函数。
  66. 普通的c函数编译器都是通过name mangling技术,来对函数加以区分:
  67. StackObj->instance()等同于:ZN1A8instanceEv()
  68. 备注:
  69. ①事实上编译器为了避免函数重载造成的重名情况,会对函数的名字进行处理,使之成为独一无二的名称。 (name mangling技术)
  70. ②将成员函数声明为static,可以使成员函数不经由this指针便可调用。
  71. ③vptr表中,索引号0为类的type_info。

http://blog.csdn.net/acs713/article/details/7825994

一叶知秋:“安全“的野指针、 static函数、成员函数、this 指针、gcc编译器、name mangling相关推荐

  1. C++知识点11——this指针,const成员函数,访问权限控制

    1.this指针 每个类都有this指针,this指针指向this指针指向的是类的对象本身 class A { public:A() {}~A() {}void func() {cout<< ...

  2. 详解函数指针和类成员函数指针

    作者:倾夜·陨灭星尘 一.什么是函数指针? 函数指针,顾名思义即指向函数的指针. 如果要问,为什么能用一个指针指向一个函数呢?我觉得要理解这个问题,以及要理解后面的函数指针和类成员函数指针,没有什么比 ...

  3. C++中空指针调用类成员函数的原理

    有下面的一个简单的类: class CNullPointCall { public:     static void Test1();     void Test2();     void Test3 ...

  4. 为什么不能同时用const和static修饰成员函数?

    const修饰的函数: 表示在该函数体内不能修改成员的值,会在函数中添加一个隐式的参数const this*. static修饰的函数没有this指针,与const的用法冲突. 但可以使用static ...

  5. C++基础08-this指针-const修饰成员函数-函数返回引用/值

    一.this指针 1.C++类对象中的成员变量和成员函数是分开存储的.C语言中的内存四区模型仍然有效! 2.C++中类的普通成员函数都隐式包含一个指向当前对象的this指针. 3.静态成员函数.成员变 ...

  6. C++函数指针和类成员函数指针

    一.函数指针--基本形式 char Fun(int n) { return char(n); } //char(*pFun)(int);void main() {char(*pFun)(int);pF ...

  7. C++ this指针和const成员函数

    this指针 this指针:成员函数通过一个名为this的隐式形参来访问调用它的那个对象.this由调用该成员函数的对象的地址初始化. 1 Sales_data total; 2 total.isbn ...

  8. C++普通函数指针和类成员函数指针

    举例1:普通函数指针: int(*fun)(double, int);fun = [](double a, int b) {cout << a << endl;cout < ...

  9. C++ const关键字的总结(全局/局部变量、修饰指针和引用、成员函数和数据成员、修饰类对象、const与宏定义的区别、Static与Const的区别)

    const关键字 const关键字 1.什么是const 2.使用原理 2.1.const全局/局部变量 2.2.cosnt修饰指针和引用 2.3.const修饰函数参数 2.4.const修饰函数返 ...

  10. 成员函数指针与高性能的C++委托(三)

    委托(delegate) 和成员函数指针不同,你不难发现委托的用处.最重要的,使用委托可以很容易地实现一个Subject/Observer设计模式的改进版[GoF, p. 293].Observer( ...

最新文章

  1. Linux更新pip国内源
  2. Android LK Bootlaoder启动概览
  3. wps定位对话框快捷键_Word、Excel、PPT快捷键汇总
  4. linux多进程网络实例,Linux下一个单进程并发服务器的实例 使用select
  5. Linux vim编辑器常用命令
  6. JAVA WEB_中间件
  7. Flink 合流水位线图解
  8. 建设“智慧法院” 引入庭审语音识别系统
  9. 注解学习(参考尚硅谷视频)
  10. 数字图像处理编程入门笔记
  11. 日历算法学习总结——公历
  12. python樱桃小丸子_appium+python自动化启动app
  13. QQ分析和密码获取,阿里旺旺分析和密码获取,新浪UC分析和密码获取,以及所有的UC端...请不要乱用,我可不负责
  14. push()与pop()的使用
  15. 2021-05-23:pandas 新增sheet,不覆盖原来已经保存的sheet
  16. python 调用Google Translate API 翻译
  17. 【原】拯救你的机械硬盘!
  18. WordPress加速缓存插件WP Super cache安装方法及使用技巧
  19. 软件测试——电话号码的查询界面如图所示。对地区码和电话号码的规定如下
  20. mysql 商品属性搜索出商品

热门文章

  1. ansible 基本操作(初试)
  2. 中国大陆物联网驶入快车道 台商抢上车
  3. 网站目录爆破的扫描器的思路
  4. 一步一步使用Ext JS MVC与Asp.Net MVC 3开发简单的CMS后台管理系统之创建项目
  5. 装箱与拆箱的概念及意义
  6. Ubuntu 10.10用LibreOffice替换OpenOffice
  7. 使用selenium和phantomJS浏览器登陆豆瓣的小演示
  8. tree(2018.10.26)
  9. PS基础教程[1]如何制作微信泡泡
  10. 徐汉彬:亿级Web系统搭建—单机到分布式集群