一、this指针
1、this指针的引入
- 应用场景1:当我们在类中定义了一个变量同时在类成员函数中定义了一个同名变量,即变量名重复时我们又想使用类中定义的变量,此时便需要this指针
- 应用场景2:当成员函数的参数与类的成员函数名相同时,在赋值的时候要用this指针,类似场景1,即this.a=a;不能写成a=a;
- 应用场景3:在类的非静态成员函数中返回类对象本身的时候,直接使用return *this;
2、this指针仅存在于类的成员函数中,指向被调用函数所在类实例的地址。
-
1 class Point 2 { 3 int x, y; 4 public: 5 Point(int a, int b) { x=a; y=b;} 6 Void MovePoint( int a, int b){ x+=a; y+=b;}//函数内部定义默认为内联函数 7 }; 8 void main( ) 9 {10 Point point1( 10,10);11 point1.MovePoint(2,2);12 }
- 当point1调用MovePoint(2,2)函数时,即将point1对象的地址传递给了MovePoint()成员函数的默认的this指针。
- MovePoint()函数的原型应该是 void MovePoint(Point *this,int a,int b);第一个参数是指向该类对象的一个指针,我们在定义成员函数式未看见是因为这个参数在类中是隐含的。函数的具体实现过程也可以替换成this.x+=a;this.y+=b;
3.关于this指针的一些问题
- this指针只能在成员函数中使用,全局函数,静态函数都不能使用this指针。。。成员函数默认的第一个参数为T *const this
-
1 class A2 {3 public:4 int fun(int p){}5 }6 7 8 //fun 的原型在编译器看来应该是9 //int fun(A *const this,int p);
-
- this指针在函数的开始前构造,在成员函数结束后清除。当调用一个类的成员函数时,编译器将类的指针作为成员函数的this参数传递进去
-
A a;a.fun(1);//编译器会将此次调用编译成:A::fun(&a,1);
-
- this指针存放在何处?堆、栈、全局变量、还是其他
- this指针会因编译器的不同而有不同的存储位置,可能是栈,可能是寄存器,也可能是全局变量。