C++this指针操做ios
在这里总结一下this 指针的相关知识点。函数
首先,咱们都知道类的成员函数能够访问类的数据(限定符只是限定于类外的一些操做,类内的一切对于成员函数来讲都是透明的),那么成员函数如何知道哪一个对象的数据成员要被操做呢,缘由在于每一个对象都拥有一个指针:this指针,经过this指针来访问本身的地址。注:this指针并非对象的一部分,this指针所占的内存大小是不会反应在sizeof操做符上的。this指针的类型取决于使用this指针的成员函数类型以及对象类型,(1)假如this指针所在类的类型是Stu_Info_Mange类型,(下面的测试用例中的类的类型,借来用用),而且若是成员函数是很是量的,则this的类型是:Stu_Info_Mange * const 类型,(2)既一个指向非const Stu_Info_Mange对象的常量(const)指针,倘若成员函数是常量类型,则this指针的类型是一个指向constStu_Info_Mange对象的常量(const)指针。有点绕吧,仔细理解。测试
二:this指针经常使用概念this
this只能在成员函数中使用。全局函数,静态函数都不能使用this。实际上,成员函数默认第一个参数为T* const register this。编码
为何this指针不能再静态函数中使用?spa
你们能够这样理解,静态函数如同静态变量同样,他不属于具体的哪个对象,静态函数表示了整个类范围意义上的信息,而this指针却实实在在的对应一个对象,因此this指针固然不能被静态函数使用了,同理,全局函数也同样,我是这样理解的,不知道你们怎样理解,你们能够评论交流下。指针
(1):this指针是何时建立的?code
this在成员函数的开始执行前构造的,在成员的执行结束后清除。对象
(2)this指针如何传递给类中函数的?绑定?仍是在函数参数的首参数就是this指针.那么this指针又是如何找到类实例后函数的?内存
this是经过函数参数的首参数来传递的。this指针是在调用以前生成的。类实例后的函数,没有这个说法。类在实例化时,只分配类中的变量空间,并无为函数分配空间。自从类的函数定义完成后,它就在那儿,不会跑的。
(3)this指针只有在成员函数中才有定义。所以,你得到一个对象后,也不能经过对象使用this指针。因此,咱们也没法知道一个对象的this指针的位置(只有在成员函数里才有this指针的位置)。固然,在成员函数里,你是能够知道this指针的位置的(能够&this得到),也能够直接使用的。
三:this指针的使用:
一种状况就是,在类的非静态成员函数中返回类对象自己的时候,咱们可使用圆点运算符(*this).,箭头运算符this->,另外,咱们也能够返回关于*this的引用,这样咱们能够像输入输出流那样进行“级联”操做。
文字理解起来很枯燥,不如例子直接,咱们下面就举几个实用的例子来分析。
咱们创建一个学生信息类,具体东西注释很清晰了,直接上代码、
#include<iostream> #include<string> using namespace std; class Stu_Info_Mange { int sno; string sname; int age; int grade; public: Stu_Info_Mange(int s=0,string n="",int a=0,int g=0) { sno=s; sname=n; age=a; grade=g; } void Setsname(int sn) //使用this指针进行赋值 { this->sname=sn; } int Setage(int a) { this->age=a; return (*this).age; //使用this指针返回该对象的年龄 } void print() { cout<<"the sname is "<<this->sname<<endl; //显式this指针经过箭头操做符访问 cout<<"the sno is "<<sno<<endl;//隐式使用this指针打印 cout<<"the age is "<<(*this).age<<endl;//显式使用this指针经过远点操做符 cout<<"the grade is "<<this->grade<<endl<<endl; } }; int main() { Stu_Info_Mange sim1(761,"张三",19,3); sim1.print(); //输出信息 sim1.Setage(12); //使用this指针修改年龄 sim1.print(); //再次输出 return 0; }
以上的例子中,咱们要设置一个学生的信息,须要对每个相关变量所属的成员函数进行调用(名字调用设置名字的成员函数。。。),咱们还可使用this的另一个功能,让他实现级联,方便咱们调用,对此,咱们对上述代码进行修改,以下:
#include<iostream> #include<string> using namespace std; class Stu_Info_Mange { int sno; string sname; int age; int grade; public: Stu_Info_Mange(int s=0,string n="",int a=0,int g=0) { sno=s; sname=n; age=a; grade=g; } <span style="color:#ff0000;">Stu_Info_Mange &</span> Setsname(string s) //<span style="color:#ff0000;">全部的相关函数,都返回该对象的引用,这样就能够实现级联,方便编码</span> { this->sname=s; <span style="color:#ff0000;">return (*this);</span> } <span style="color:#ff0000;">Stu_Info_Mange &</span> Setsno(int sno) { this->sno=sno; <span style="color:#ff0000;">return *this</span>; } <span style="color:#ff0000;">Stu_Info_Mange &Setgrade(</span>int grade) { this->grade=grade; <span style="color:#ff0000;">return *this;</span> } <span style="color:#ff0000;">Stu_Info_Mange &</span>Setage(int age) { this->age=age; <span style="color:#ff0000;">return *this;</span> } void print() { cout<<"the sname is "<<this->sname<<endl; cout<<"the sno is "<<this->sno<<endl; cout<<"the age is "<<this->age<<endl; cout<<"the grade is "<<this->grade<<endl<<endl; } }; int main() { Stu_Info_Mange sim;// 使用默认参数 <span style="color:#ff0000;">sim.Setsname("张三").Setsno(457).Setgrade(2012).Setage(20); //级联</span> //使用this指针使串联的函数调用成为可能 sim.print(); return 0; }
关于this指针的一些概念就总结到这里吧,如今抓紧攻读C++primer,有新东西再完善吧。