标签:c++的this指针
1. 一个对象占多大空间呢?
是由对象里面的成员变量决定的。
不在对象的内存里面,它在代码区。所有函数写完都在代码区,只有在调用的时候才去代码区找。既然函数不在对象里,那么函数里面的那个this指针代表当前对象是怎么回事???
3. 调用成员函数时,会自动传this指针
4. this指针是指向当前对象的指针
5. 在成员函数中,可以将this指针当参数传递,也可以返回this指针,或返回通过this指针拿到的对象
#include <iostream> using namespace std; //日期类 class Date{ int year,month,day; // int x; public: //构造方法 初始化列表初始化成员变量 Date(int _y,int _m,int _d):year(_y),month(_m),day(_d){ } #pragma 问题 --- -现在有个问题:参数名跟变量名一样,如何区分开哪个是参数哪个是变量??? /* void set(int year,int month,int day){ //局部变量优先原则:在这里编译器会把参数year赋值给参数year。所以我们只需要告诉编译器哪个是当前对象的成员变量即可 year = year; month = month; day = day; } */ void setValue(int year,int month,int day){ this -> year = year; //this -> year是成员变量 指针访问成员变量用箭头 this -> month = month; this -> day = day; // x = 800; //一般情况下用到成员变量 默认添加 this -> x } #pragma 问题 --- this 指针哪里来的????? //把当前对象传进函数里面 显式显示出来了self指向当前对象 //同理this也是一样的,只要把self改成this即可,因为给this传的就是当前调用函数的那个对象 //这部分是编译器做的事情,编译器把这部分隐藏了 void setValue2(int year,int month,int day,Date* self){ self -> year = year; self -> month = month; self -> day = day; } #pragma mark- 调用函数的时候隐式的传一个Date* this指针进去。如果是OC里隐式传一个self指针 void test(){ this->year = 2002; cout << "this保存的地址:" << this << endl; } void show(); }; //在.cpp里面写函数如果没有指定是哪个类的函数 那么它就是全局函数 #pragma 全局函数的调用 不需要对象去调用,也就没有当前对象了。没有当前对象那么void show(this)这里就不会传进this指针 如果没有this指针,就不知道hour变量到底是哪个对象的 /* void show(){ cout << hour << "时" << min << "分" << sec << "秒" << endl; } */ #pragma 如果是写成成员函数的话,那么就是通过对象去调用该函数。哪个对象调用的就把自己传进来,那么这个hour也就是调用函数的那个对象的hour .就像OC里面调用方法的时候里面传进一个self //主函数 int main(){ Date d(2015,1,23); #pragma 问题 --- 既然函数不在对象中,那么对象是怎么调用函数的???函数在代码区 函数名实际上是一个函数指针,指向代码区的一个函数。既然在代码区,那么那个this->year的this是哪出来的?? d.setValue(2018, 8, 8); //this指向当前对象,意思是指向调用这个函数的对象 谁调用这个函数,this就指向当前对象 Date d2(2013,11,28); d2.setValue2(2019, 8, 15,&d2);//虽然是成员函数,也是放在代码区的,等真正调用到的时候通过函数指针去代码区找到这个函数运行。而创建对象的那块内存空间并没有放函数 cout << "对象的地址: " << &d << endl; d.test();//把当前对象自己 隐式地传进去 d.test(&d);只是这些事情是编译器做的,所以在函数当中我们能够拿到一个this指针 return 0; }
对象的地址: 0x7fff5fbff830 this保存的地址:0x7fff5fbff830 Program ended with exit code: 0
标签:c++的this指针
原文地址:http://blog.csdn.net/love9099/article/details/43059191