关于this指针

本文深入探讨C++中this指针的使用场景与生命周期,解释了this指针如何在成员函数中创建并传递,以及它与类实例的关系。同时,文章还讨论了this指针在不同编译器中的实现差异。

                                

 

初学者对this指针真的是很好奇,因为它很神秘。

其实,只要以平常心来看待,this就很平常了。
1. this只能在成员函数中使用。
全局函数,静态函数都不能使用this。
实际上,成员函数默认第一个参数为T* const register this。
如:
class A{public: int func(int p){}};
其中,func的原型在编译器看来应该是: int func(A* const register this, int p);

2. 由此可见,this在成员函数的开始前构造的,在成员的结束后清除。
这个生命周期同任一个函数的参数是一样的,没有任何区别。
当调用一个类的成员函数时,编译器将类的指针作为函数的this参数传递进去。如:
A a;
a.func(10);
此处,编译器将会编译成: A::func(&a, 10);
嗯,看起来和静态函数没差别,对吗?不过,区别还是有的。编译器通常会对this指针做一些优化的,因此,this指针的传递效率比较高--如vc通常是通过ecx寄存器来传递this参数。

3. 回答
#1:this指针是什么时候创建的?
this在成员函数的开始执行前构造的,在成员的执行结束后清除。
#2:this指针存放在何处? 堆,栈,全局变量,还是其他?
this指针会因编译器不同,而放置的位置不同。可能是栈,也可能是寄存器,甚至全局变量。
#3:this指针如何传递给类中函数的?绑定?还是在函数参数的首参数就是this指针.那么this指针又是如何找到类实例后函数的?
this是通过函数参数的首参数来传递的。this指针是在调用之前生成的。类实例后的函数,没有这个说法。类在实例化时,只分配类中的变量空间,并没有为函数分配空间。自从类的函数定义完成后,它就在那儿,不会跑的。
#4:this指针如何访问类中变量的/?
如果不是类,而是结构的话,那么,如何通过结构指针来访问结构中的变量呢?如果你明白这一点的话,那就很好理解这个问题了。
在C++中,类和结构是只有一个区别的:类的成员默认是private,而结构是public。
this是类的指针,如果换成结构,那this就是结构的指针了。

#5:我们只有获得一个对象后,才能通过对象使用this指针,如果我们知道一个对象this指针的位置可以直接使用吗?
this指针只有在成员函数中才有定义。因此,你获得一个对象后,也不能通过对象使用this指针。所以,我们也无法知道一个对象的this指针的位置(只有在成员函数里才有this指针的位置)。当然,在成员函数里,你是可以知道this指针的位置的(可以&this获得),也可以直接使用的。
#6:每个类编译后,是否创建一个类中函数表保存函数指针,以便用来调用函数?
普通的类函数(不论是成员函数,还是静态函数),都不会创建一个函数表来保存函数指针的。只有虚函数才会被放到函数表中。
但是,既使是虚函数,如果编译器能明确知道调用的是哪个函数,编译器就不会通过函数表中的指针来间接调用,而是会直接调用该函数。

# 7:这些编译器如何做到的?8:能否模拟实现?
知道原理后,这两个问题就很容易理解了。
其实,模拟实现this的调用,在很多场合下,很多人都做过。
例如,系统回调函数。系统回调函数有很多,如定时,线程啊什么的。

举一个线程的例子:
class A{
int n;
public:
static void run(void* pThis){
A* this_ = (A*)pThis;
this_->process();
}
void process(){}
};

main(){
A a;
_beginthread( A::run, 0, &a );
}

这里就是定义一个静态函数来模拟成员函数。

也有许多C语言写的程序,模拟了类的实现。如freetype库等等。
其实,有用过C语言的人,大多都模拟过。只是当时没有明确的概念罢了。
如:
typedef struct student{
int age;
int no;
int scores;
}Student;
void initStudent(Student* pstudent);
void addScore(Student* pstudent, int score);
...
如果你把 pstudent改成this,那就一样了。

它相当于:
class Student{
public:
int age; int no; int scores;
void initStudent();
void addScore(int score);
}

const常量可以有物理存放的空间,因此是可以取地址的


///this指针是在创建对象前创建.
this指针放在栈上,在编译时刻已经确定.
并且当一个对象创建后,并且运行整个程序运行期间只有一个this指针.

本篇文章转载

 
<think>好的,我现在需要解决用户提出的关于C++this指针的问题。题目是四个选项中哪一个是正确的,选项包括A到D。首先,我得回忆一下C++this指针的相关知识,确保自己理解正确,然后逐一分析每个选项的正确性。 首先,用户的问题是关于this指针的正确叙述,选项分别是: A)类的成员函数都有this指针 B)类的友元函数都有this指针 C)任何与类相关的函数都有this指针 D)类的非静态成员函数都有this指针 我需要逐个分析每个选项是否正确。让我先回忆一下this指针的基本概念。在C++中,this指针是一个隐含的指针,指向调用成员函数的对象实例。每当一个非静态成员函数被调用时,编译器会自动将对象的地址作为this指针传递给该函数。因此,this指针只在非静态成员函数中存在。而静态成员函数属于类本身,不属于任何对象实例,因此它们没有this指针。此外,友元函数并不是类的成员函数,它们只是被允许访问类的私有和保护成员的外部函数,因此友元函数也没有this指针。 现在开始分析选项: 选项A说“类的成员函数都有this指针”。这里需要区分静态成员函数和非静态成员函数。因为静态成员函数没有this指针,所以如果类中有静态成员函数,那么这些函数是没有this指针的。因此选项A不正确。例如,如果有类中的静态函数,它们不会被传递this指针,所以选项A错误。 选项B提到“类的友元函数都有this指针”。友元函数并不是类的成员函数,它们只是被授权访问类的私有成员的外部函数。因此,友元函数不会自动获得this指针,即使它们可以操作类的对象,也必须显式地通过参数传递对象实例。所以选项B不正确。 选项C断言“任何与类相关的函数都有this指针”。这里的“与类相关的函数”可能包括成员函数、友元函数、静态函数等。但显然,静态成员函数和友元函数都没有this指针,所以选项C是错误的。 选项D指出“类的非静态成员函数都有this指针”。根据之的分析,非静态成员函数确实在调用时隐式地接收this指针,指向调用它们的对象实例。因此,选项D是正确的。 接下来,我需要确认是否有例外情况或特殊情况需要考虑。例如,是否有可能在非静态成员函数中显式地删除this指针,或者是否有其他情况导致this指针不存在?根据C++标准,非静态成员函数总是有this指针,无论函数内部是否使用它。即使函数体内没有使用this编译器仍然会传递this指针。因此,选项D是正确的,而其他选项都有明显的错误。 总结: - 选项A错误,因为静态成员函数没有this指针。 - 选项B错误,友元函数不是成员函数,没有this指针。 - 选项C错误,因为静态函数和友元函数属于类相关但没有this指针。 - 选项D正确,非静态成员函数都有this指针。 因此,正确答案是选项D。</think>关于 `this` 指针的正确选项是 **D**。以下是对各选项的详细分析: --- ### **选项A** **错误** - **关键点**: `this` 指针仅存在于**非静态成员函数**中。 - **静态成员函数**属于类而非对象,没有 `this` 指针。 - **示例**: ```cpp class MyClass { public: void nonStaticFunc() { /* 隐含 this 指针 */ } static void staticFunc() { /* 无 this 指针 */ } }; ``` 因此,“类的成员函数都有 `this` 指针”是错误的。 --- ### **选项B** **错误** - **关键点**: **友元函数(`friend`)不是类的成员函数**,只是被授权访问类的私有成员的外部函数。 - 友元函数需显式接收对象作为参数,无法隐式获取 `this` 指针。 - **示例**: ```cpp class MyClass { private: int data; public: friend void friendFunc(MyClass& obj) { obj.data = 10; // 需通过对象参数访问成员 } }; ``` 因此,友元函数没有 `this` 指针。 --- ### **选项C** **错误** - **关键点**: “与类相关的函数”可能包含静态成员函数、友元函数等,但: 1. **静态成员函数**无 `this` 指针。 2. **友元函数**无 `this` 指针。 - **示例**: ```cpp class MyClass { public: static void staticFunc(); // 无 this friend void friendFunc(); // 无 this }; ``` 因此,“任何与类相关的函数都有 `this` 指针”是错误的。 --- ### **选项D** **正确** - **关键点**: **非静态成员函数**在调用时,编译器会隐式传递当对象的地址作为 `this` 指针。 - 即使函数未显式使用 `this`,它仍然存在。 - **示例**: ```cpp class MyClass { public: void func() { // 等价于 this->data = 10; data = 10; // 隐式通过 this 访问成员 } private: int data; }; ``` 因此,“类的非静态成员函数都有 `this` 指针”是正确的。 --- ### **总结** 正确选项为 **D**。 **关键区别**: 1. `this` 是**非静态成员函数的隐式参数**。 2. 静态函数、友元函数、全局函数均无 `this`。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值