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

转载于:https://www.cnblogs.com/wangicter/archive/2012/10/05/4767272.html

一叶知秋:“安全“的野指针、 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. 开发Java系统程序员要注意的基本知识
  2. python3:module
  3. linux中查看用户组标识符,Linux用户和组管理
  4. vue条件语句与循环语句的基本使用
  5. 网络编程套接字API
  6. 【codevs2304】【BZOJ1875】HH去散步,第一次的矩阵加速DP
  7. 搜狗输入法回应误推地震信息;近亿人在钉钉上报健康情况;Rust 1.41.0发布 | 极客头条...
  8. Centos 6 系统镜像光盘做YUM源
  9. 【渝粤教育】电大中专电子商务网站建设与维护_1作业 题库
  10. 甘特图是什么意思?甘特图制作步骤教程
  11. Android 编写WiFi探针,一种WiFi探针路由器的制作方法
  12. AOP切面之实现计算器加减乘除--基于注解的方式
  13. android中按钮凹下去,实现按钮的点击效果
  14. 芯片验证漫游指南_博通Wi-Fi芯片被曝安全漏洞,超10亿台终端或受影响,苹果、谷歌、小米、华为等大厂在列...
  15. 【068】特征选择之 pearson 皮尔森系数 PimaIndiansdiabetes
  16. 征女友(搞笑)(转)
  17. Lind.DDD.LindMQ的一些想法
  18. JAVA的异常处理机制有什么好处,你造吗?
  19. c++自制小游戏(不完美)
  20. 推断性统计部分(三)---假设检验

热门文章

  1. 网络安全笔记8——虚拟专网技术
  2. 黑苹果无法连接wifi
  3. layui 单图片上传 多图片批量上传
  4. 熊猫烧香.威金.落雪.SXS.ARP.网络执法管.AUTORUN.INF等高危病毒清除
  5. 开发三星GALAXY Tab应用程序
  6. 跳石板-2017网易校招
  7. opencv-viz模块简单示例
  8. r计算百分位数_R中产生的分位数和百分位数之间的差异
  9. Java Service Wrapper将java程序设置为服务
  10. 【Mysql】Communications link failure,The last packet sent successfully to the server was 0 millisecond