您的位置:首页 > 编程语言 > C语言/C++

非静态成员函数与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++