类中函数的一个隐含参数--this指针
2017-03-11 19:29
274 查看
为什么会有this指针呢?
我们需要来看一段代码感受一下。#include <iostream> using namespace std; class Student { public: void InitStudent(char *name,char*gender,int age) { strcpy(_name,name); stcpy(_gender,gender); _age = age; } private: char _name[20]; char _gender[5]; int _age = age; }; int main () { Student s1,s2; s1.InitStudent("chan","nv",18);//在这里为什么只要进入这个初始化函数系统就知道你要初始化的是s1,为什么呢?这个时候我们就知道了原来在类的成员函数中有一个默认的隐含指针,this。 s2.InitStudent("xin","nan",21); return 0; } 所以上面那个函数参数加完整的话应该为 InitStudent(const *this,cha*name,char*gender,int *age);
那么什么是this指针呢?
this指针作为一个隐含参数传递给非静态成员函数,用以指向该成员函数所属类所定义的对象。当不同对象调用同一个类的成员函数代码时,编译器会依据该成员函数的this指针所指向的不同对象来确定应该一用哪个对象的数据成员。下面举一个简单例子。#include<iostream> using namespace std; class Student { public: void InitStudent(char *name,char *gender,int *age) { strcpy(this->_name,name); strcpy(this->_gender ,gender); test->_age = age;//在这里为什么可以使用this这个指针呢,并没有定义啊,这就是因为,他是一个隐含的参数。 } }; int main() { Student s1,s2; s1.InitStudent("chan","nv",18);//在这里运行一下你就可以发现this的地址和s1的地址是相同的 s2.InitStudent("xin","nan",21); return 0; }
从图片可以看出两者的地址是相同的。
那么在类外还有没有this指针呢?
开始已经说了this指针是类中函数的一个隐含参数,是不是呢,以下是一个小小的检测。可以看出,当你在类外自己定义一个函数时,编译器根本不能能编译通过,说明它确实只能在类中使用。
this指针有哪些特性呢
1:this是一个指针,它时时刻刻指向你这个实例本身。2:this指针的类型 类类型 *const
3 : this指针并不是对子昂本身的一部分,不影响sizeof的结果
4:this指针的作用域在类成员函数的内部
5:只有在类的非静态成员函数中才可以使用,其它任何函数都不可以
this指针是怎么传参的
1:参数个数确定,this指针通过ecx传递给调用者。2:参数不确定,this指针在所有参数被压入栈后再压入堆栈。
这里会涉及到两个函数调用约定 __cdecl __thiscall
那么什么是函数调用约定呢?
函数调用约定是指当一个函数被调用时,函数的参数会被传递给被调用的函数和返回值会被返回给调用函数。它就是用来描述参数是怎么传递和由谁平衡堆栈的。__cdecl
参数是从右向左传递的,参数个数固定,由函数本身清理堆栈。__thiscall
参数也是从右向左传递的,参数个数不定,由调用者清理堆栈。相关文章推荐
- this指针作为函数隐含参数传递的方法
- C#调用参数为函数指针的API函数 - 以SetUnhandledExceptionFilter为例编写一个全局异常处理程序
- 智能指针变量做函数参数的一个值得注意的地方
- 用变量a给出下面的定义:一个有10个指针的数组,该指针指向一个函数,该函数有一个整形参数并返回一个整型数
- 类中的this指针 一个类的指针指向NULL去访问该类的成员函数
- C++语言笔试题目写一个函数计算当参数为n(n很大)时的值 1-2+3-4+5-6+7......+n&字符指针、浮点数指针、以及函数指针占用的内存等
- 定义一个含10个函数指针的数组,指向的函数带一个整形参数
- 封装回调函数——为对象方法(Object Method,参数中带this指针的函数) 构造 普通函数(参数中无this指针的函数)形式 的入口
- 封装回调函数——为对象方法(Object Method,参数中带this指针的函数) 构造 普通函数(参数中无this指针的函数)形式 的入口
- 类和对象 , 四个默认成员函数及运算符重载 , 隐含的this指针
- 成员函数中隐含的this指针的类型
- 关于结构指针类型数组做函数参数的一个问题#include<stdio.h>typede
- 如果函数的参数是一个指针,不要指望用该指针去申请动态内存。
- 建立一个对象数组,内放5个学生数据(学号、成绩),设立一个函数max,用指向对象的指针作函数参数,在max函数中找出5个学生中成绩最高者,并从输出学号。
- 一个关于函数内部指针参数返回的错误调试及分析
- 函数参数用指针或引用传递时发现的一个小问题
- Delphi动态事件深入分析(对象方法在调用的时候会传递一个隐含的Self指针,而该指针的值在EAX中。即左边第一个参数)
- thiscall仅仅应用于“C++”成员函数(this指针存放于CX寄存器,参数从右到左压)
- C++调用一个成员函数的需求this指针的情况
- 建立一个对象数组,内放5个学生的数据(学号,成绩),用指向对象的指针做函数参数,在max函数中找出5个学生中成绩最高者,并输出其学号。