This 指针的问题。

哈上的风景 2013-11-15 03:55:50
接触This指针试着去查了一下,感觉感念还是很模糊,用法上也是很朦胧。
首先来说This指针以后会不会频繁的去用?
其次,关于This指针独有的用法,除了返回调用函数对象的地址还有什么用处,有几个?是什么?
求有经验的人总结一下精华。
...全文
325 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
qdlgdx_lsy 2013-11-18
  • 打赏
  • 举报
回复
目前只知道this指针放的是对象的地址和对象在内存中放的是啥东西。其他的不知道。
lm_whales 2013-11-17
  • 打赏
  • 举报
回复
this 的作用域,是拥有该 this 指针的,非静态成员函数,大括号内部。 构造函数,还包括初始化表。
lm_whales 2013-11-17
  • 打赏
  • 举报
回复
this 指针,就是非静态成员函数的一个参数。 除了指针自增,自减,以及指针算术运算中,会改变该指针本身的值的场合以外 可以用在任何场合。 this 的作用域,是拥有该 this 指针的,非静态成员函数,大括号内部。 this 指针,不是对象的一部分。 仅仅是一个,和对象地址值相同的, 非静态成员函数的,一个指针参数。 PS: 是非静态成员函数的,隐藏的形式参数不出现在,非静态成员函数的,参数表中。 至少在X86 Win32 VC中; 不是通过堆栈传递的,而是通过寄存器传递的。
lm_whales 2013-11-17
  • 打赏
  • 举报
回复
通过下面这个小程序,你就知道this 指针是啥了。

#include<iostream>
using namespace std;
class A{
public:
A () {

this->x =30;
cout<<"x ="<<x <<endl;
cout<<"this->x = "<<x<<endl; 
cout<<"this ="<<this<<endl; 
}
void print()
{    
     this->x=10;
     cout<<"x ="<<x<<endl;
     cout<<"this->x "<< this->x<<endl; 
     x=100;
     cout<<"x ="<<x<<endl;
     cout<<"this->x "<< this->x<<endl;
     cout<<"this ="<<this<<endl; 
}

private:
int x;
}; 

int main(){
A a; // 调用 A::A(); this == &a
cout<< "address of a ="<<&a<<endl;
a.print(); //调用 A::print; this == &a;
A *p =&a;
cout<< "ptr vlaue: p ="<< p <<endl;
p->print();

A &r =a;
cout<< "address of ref type: r =  "<< &r <<endl;
p->print();

return 0;  
}
PS : 类的每个非静态函数,都有一个隐藏参数 this; this 指针,表示 对象,指针语法,调用非静态成员函数的,那个对象的地址。 引用,和对象调用成员函数 1)obj.fun(....); 2)ref.fun(...); 这可以称作对象语法。 指针 调用非静态成员函数 3)ptr->fun(...); 其实就是 4)(*ptr).fun(...); 这可以称作指针语法,可以看作对象语法的一种扩展。 这几种方法调用非静态成员函数 编译器会安排,传入一个隐藏的 this 指针参数。 具体落实到平台 和编译器 X86 Win32 VC 就是把对象的地址,通过 ecx 寄存器,传递给函数。 1) this = &obj; // 对象自己的地址。 2) this = &ref; // 引用的地址,就是被引用对象的地址; // 引用是对象的别名,可以看作对象自己。 3) this = ptr; // 指针的值,就是所指向的对象的地址。 4) this = ptr; // 指针的值,就是所指向的对象的地址。
nightkids_008 2013-11-15
  • 打赏
  • 举报
回复
没什么神秘的,你就当普通的就行了,只不过成员函数编译器会加一个第一个参数 (calss* this,...) 内部成员使用也会转换 this->x....,所以没必要搞那么神秘
纯洁的老黄瓜 2013-11-15
  • 打赏
  • 举报
回复
比如在某个类成员函数中创建线程,在创建的线程里头却还需要调用该类对象的方法,可以把这个对象的this指针传进去:

pthread_t ulThreadId;
	if(0 != pthread_create(&ulThreadId,NULL,ThreadSSKkQuery,(void*)this))
max_min_ 2013-11-15
  • 打赏
  • 举报
回复
引用 2 楼 fablock 的回复:
谢谢啦不过你说的只是他在代码的那个地方出现,以及他在代码中基本的作用。 我还想知道This有没有别的用法
http://blog.chinaunix.net/uid-21411227-id-1826942.html 参考下!不是三言两语说的清楚啊!
哈上的风景 2013-11-15
  • 打赏
  • 举报
回复
谢谢啦不过你说的只是他在代码的那个地方出现,以及他在代码中基本的作用。 我还想知道This有没有别的用法
  • 打赏
  • 举报
回复
在有智能提示的IDE里面,输入this->会出现成员函数和数据成员提示,在调用其他不熟悉的库时非常有用。 但是代码中一般不写this,没必要浪费6个字符

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧