非静态成员函数与this指针
来源:互联网 发布:加内特04季后赛数据 编辑:程序博客网 时间:2024/06/05 09:36
this指针的本质
This指针本质是一个函数参数,只是编译器隐藏起形式的,语法层面上的参数。this指针只能在非静态成员函数中使用,全局函数、静态函数都不能使用this指针。实际上,非静态成员函数默认的第一个参数为T* const this
例如,调用date.SetMonth(9) <===> SetMonth(&date, 9),this帮助完成了这一转换 .
所以,this指针并非类的成员,仅仅是调用非静态成员函数时的一个输入参数。其生命期仅仅是非静态成员函数体内部。顺理成章的,this指针也就不占用对象的空间,它仅仅是函数call时压栈了
Q:this指针是如何传递给类中的函数的?绑定?还是在函数参数的首参数就是this指针?那么,this指针又是如何找到“类实例后函数”的?
A:大多数编译器通过eax寄存器传递this指针。事实上,这也是一个潜规则。一般来说,不同的编译器都会遵循一致的传参规则,否则不同的编译器产生的obj就无法匹配了。
Q:我们只有获得一个对象后,才能通过对象使用this指针。如果我们知道一个对象this指针的位置,可以直接使用吗?
A:this指针只有在成员函数中才有定义。因此,你获得一个对象后,也不能通过对象使用this指针。所以,我们无法知道一个对象this指针的位置(只有在成员函数里才有this指针的位置)。当然,在成员函数里,你是可以知道this指针的位置的(可以通过&this获得)。
在类中使用非静态成员函数指针
对于某些情况,需要指明函数指针及其参数,如线程类std::thread的构造函数
class myThread{bool thread_proc(){...};...void thread_create(){std::thread m_ thread(&myThread::thread_proc); //编译报错:error C2064: 项不会计算为接受 0 个参数的函数std::thread m_ thread(&myThread::thread_proc,this); //ok}...}
Q:为什么使用&myThread::thread_ proc表示函数指针而非 thread_ proc
A:类的静态成员函数采用与一般函数指针相同的调用方式,而受this指针的影响,类的非静态成员函数与一般函数指针是不兼容的。而且,不同类的this指针是不一样的,因此,指向不同类的非静态成员函数的指针也是不兼容的。指向类的非静态成员函数的指针,在声明时就需要添加类名。
Q:为什么&myThread::thread_proc后要加上this?
A:因为类的非静态成员函数默认参数包括对象的this指针
Q:std::thread必须使用静态函数或者全局函数作为线程处理函数吗?
A:不是,也可以使用类的非静态成员函数,只是构造时需要指明隐含的this指针
- 非静态成员函数与this指针
- This 指针和静态成员函数
- 函数指针--成员函数(静态,非静态)&普通函数
- this指针指向当前调用对象,只是用于类的非静态成员函数。静态函数和全局函数 无当前对象,无this指针。
- 静态成员函数与非静态成员函数的区别
- C++ this指针与const成员函数
- 普通函数,成员函数,静态成员函数与【指针】
- 指向非静态成员函数的函数指针
- 类中非静态成员函数中的----this指针
- 基础-函数-静态方法、非静态方法、静态成员、非静态成员与多线程
- 关于函数指针调用C++非静态成员
- 类的非静态成员函数指针详解
- 静态成员函数引用非静态成员
- 静态成员函数访问非静态成员
- 静态成员函数调用非静态成员
- 指向非静态成员指针和指向静态成员指针
- 静态成员与非静态成员区别
- 静态成员与非静态成员
- 浅谈Vue.js
- python连接mysql数据库
- 数据仓库的多维数据模型
- 100家大公司java笔试题汇总(带答案)
- NSURLSession的使用
- 非静态成员函数与this指针
- Dijkstra+堆优化模板 (手写堆简单易懂)
- JAVA代码覆盖率工具JaCoCo-实践篇
- Linux进程和线程的发展
- iOS中利用NSURLSession进行文件断点下载
- 将大数据,分批分段,插入数据库
- 我的第一篇博客
- 深入理解iOS开发中的BitCode功能
- 二进制中1的个数