非静态成员函数与this指针
2016-11-15 15:45
501 查看
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指针
相关文章推荐
- C++关于this指针、静态变量和静态成员函数
- 静态成员函数、this指针、对象指针和动态对象使用小结
- This 指针和静态成员函数
- C++非静态成员函数的this指针
- C++关于this指针、静态变量和静态成员函数 http://www.cnblogs.com/clrmas/archive/2010/03/23/1692893.htm
- 一叶知秋:“安全“的野指针、 static函数、成员函数、this 指针、gcc编译器、name mangling
- 基类子类的this指针相同,但在基类函数永远调用基类的成员变量
- 函数指针 类成员函数指针 类静态成员函数指针 使用实例
- C++特性探寻-继承、成员函数、this指针
- C++11 FAQ中文版:std::function 和 std::bind(在cocos2dx中:bind能够把类内函数转成类外函数(通过传入这个类的指针 this 得到被捆绑的成员函))
- [C++]空指针访问静态成员函数
- 成员函数指针,静态成员函数指针,友元函数指针
- 派生类中基类成员函数的this指针
- C++调用成员函数需要this指针的情况
- C++回顾之成员函数重载、类与结构体、this指针
- this指针访问成员函数问题
- 成员函数中隐含的this指针的类型
- 通过指针访问类的静态成员函数
- 普通函数,成员函数,静态成员函数与【指针】
- 一般函数指针和类的成员函数指针 (this指针)