一叶知秋:“安全“的野指针、 static函数、成员函数、this 指针、gcc编译器、name mangling
- <span style="font-size:18px;">我们从实验中去总结问题
- 测试一: virtual 函数和non-virtual函数
- 01.#include <stdio.h>
- 02.class A
- 03.{
- 04.public:
- 05. void function(){printf("Hello World");} //无virtual关键字
- 06.
- 07.};
- 08.
- 09.class B
- 10.{
- 11.public:
- 12. virtual void function(){printf("Hello World");}
- 13.};
- 14.
- 15.int main( )
- 16.{
- 17. A* p1 = NULL;
- 18. p1->function(); //正常运行
- 19.
- 20. B* p2 = NULL;
- 21. p2->function(); //crash,Why?
- 22. Return 0;
- 23.};
- 测试结果:18行正常,21行crash。
- 为什么18行正常,21行死机呢?
- 其原因是:
- 每一个非虚成员函数实际上都等同于一个普通的C函数,其中第一个参数为对象指针,即我们常说的this指针。例如:
- 上面的A的function函数实际等同于:<span style="color:#ff0000;">A::Function() ç==================èFunction(A*this);
- </span>与此不同,对每一个虚成员函数的调用都是通过虚函数表的虚指针vptr来进行调用的,如上面的p2->function一句将被编译器解释为:
- (* p2->vptr[1] )(p2)
- 很容易理解,虚函数的调用是动态决定的。也很容易理解,21行crash,18行正常。很显然,如果在A类的成员函数function里,有去使用成员变量,该函数同样会crash.
- <img alt="" src="https://img-my.csdn.net/uploads/201208/03/1343961187_7766.jpg">
- 我们再来看看测试二:关于C++ static 成员函数
- #include"stdio.h"
- #include"stdafx.h"
- #include<stdio.h>
- class A
- {
- public:
- void function(){ printf("Hello World");}
- static A* instance();
- A();
- };
- static A *Test1 =NULL;
- A::A()
- {
- Test1 = this;
- }
- A* A::instance()
- {
- return Test1;
- }
- int main( )
- {
- A *StackObj = new A;
- delete StackObj;//Don’t set it to null intentionally….
- while(StackObj && StackObj->instance() )
- {
- printf("Error--->%d.\n",StackObj);
- }
- return 0;
- };
- Static函数没有this指针,可以认为他就是普通的c函数。
- 普通的c函数编译器都是通过name mangling技术,来对函数加以区分:
- StackObj->instance()等同于:ZN1A8instanceEv()
- 备注:
- ①事实上编译器为了避免函数重载造成的重名情况,会对函数的名字进行处理,使之成为独一无二的名称。 (name mangling技术)
- ②将成员函数声明为static,可以使成员函数不经由this指针便可调用。
- ③vptr表中,索引号0为类的type_info。
http://blog.csdn.net/acs713/article/details/7825994
一叶知秋:“安全“的野指针、 static函数、成员函数、this 指针、gcc编译器、name mangling相关推荐
- C++知识点11——this指针,const成员函数,访问权限控制
1.this指针 每个类都有this指针,this指针指向this指针指向的是类的对象本身 class A { public:A() {}~A() {}void func() {cout<< ...
- 详解函数指针和类成员函数指针
作者:倾夜·陨灭星尘 一.什么是函数指针? 函数指针,顾名思义即指向函数的指针. 如果要问,为什么能用一个指针指向一个函数呢?我觉得要理解这个问题,以及要理解后面的函数指针和类成员函数指针,没有什么比 ...
- C++中空指针调用类成员函数的原理
有下面的一个简单的类: class CNullPointCall { public: static void Test1(); void Test2(); void Test3 ...
- 为什么不能同时用const和static修饰成员函数?
const修饰的函数: 表示在该函数体内不能修改成员的值,会在函数中添加一个隐式的参数const this*. static修饰的函数没有this指针,与const的用法冲突. 但可以使用static ...
- C++基础08-this指针-const修饰成员函数-函数返回引用/值
一.this指针 1.C++类对象中的成员变量和成员函数是分开存储的.C语言中的内存四区模型仍然有效! 2.C++中类的普通成员函数都隐式包含一个指向当前对象的this指针. 3.静态成员函数.成员变 ...
- C++函数指针和类成员函数指针
一.函数指针--基本形式 char Fun(int n) { return char(n); } //char(*pFun)(int);void main() {char(*pFun)(int);pF ...
- C++ this指针和const成员函数
this指针 this指针:成员函数通过一个名为this的隐式形参来访问调用它的那个对象.this由调用该成员函数的对象的地址初始化. 1 Sales_data total; 2 total.isbn ...
- C++普通函数指针和类成员函数指针
举例1:普通函数指针: int(*fun)(double, int);fun = [](double a, int b) {cout << a << endl;cout < ...
- C++ const关键字的总结(全局/局部变量、修饰指针和引用、成员函数和数据成员、修饰类对象、const与宏定义的区别、Static与Const的区别)
const关键字 const关键字 1.什么是const 2.使用原理 2.1.const全局/局部变量 2.2.cosnt修饰指针和引用 2.3.const修饰函数参数 2.4.const修饰函数返 ...
- 成员函数指针与高性能的C++委托(三)
委托(delegate) 和成员函数指针不同,你不难发现委托的用处.最重要的,使用委托可以很容易地实现一个Subject/Observer设计模式的改进版[GoF, p. 293].Observer( ...
最新文章
- Linux更新pip国内源
- Android LK Bootlaoder启动概览
- wps定位对话框快捷键_Word、Excel、PPT快捷键汇总
- linux多进程网络实例,Linux下一个单进程并发服务器的实例 使用select
- Linux vim编辑器常用命令
- JAVA WEB_中间件
- Flink 合流水位线图解
- 建设“智慧法院” 引入庭审语音识别系统
- 注解学习(参考尚硅谷视频)
- 数字图像处理编程入门笔记
- 日历算法学习总结——公历
- python樱桃小丸子_appium+python自动化启动app
- QQ分析和密码获取,阿里旺旺分析和密码获取,新浪UC分析和密码获取,以及所有的UC端...请不要乱用,我可不负责
- push()与pop()的使用
- 2021-05-23:pandas 新增sheet,不覆盖原来已经保存的sheet
- python 调用Google Translate API 翻译
- 【原】拯救你的机械硬盘!
- WordPress加速缓存插件WP Super cache安装方法及使用技巧
- 软件测试——电话号码的查询界面如图所示。对地区码和电话号码的规定如下
- mysql 商品属性搜索出商品