现在还是没有找到合适的工作啊,心情有点郁闷,时阴时晴的。不过有时候刹那间想想一岁多点的吾儿,心里面还是满温馨的。好了,闲话不多说,今天给大家分享一下我对C++ this指针的一些感悟。
在介绍this指针前要说明一个概念,那就是当一个类被实例化为对象时,此时的对象内存中是不包含成员函数的,换句话说,成员函数不存在于类中,它存在于栈中的代码区,一个类只有一份。当被实例化出多个对象时,通过成员函数调用成员变量时,就需要this指针
来指出对象里面成员变量的位置。下面通过代码来演示一下。
首先声明头文件array.h 友情提示声明完头文件最后不要忘记加分号。
class array { public: array(int len); ~array(); void setlen(int len); array* getlen(); void printinfo(); private: int len; };
其次定义这个类
#include<iostream> #include"array.h" using namespace std; array::array(int len) { this->len=len; } array::~array() { } void array::setlen(int len) { this->len = len; } array* array::getlen() { return this; } void array::printinfo() { }
最后引入主函数
#include <iostream> #include <stdlib.h> #include"array.h" using namespace std; int main(int argc, char *argv[]) { array arr1(10); array *p =&arr1; array *p1=new array(10); cout<<arr1.getlen()<<endl; cout<<&arr1<<endl; cout<<p<<endl; cout<<p1<<endl; system("PAUSE"); return 0; }
运行结果如下图
其中前三个地址都为对象arr1的地址,最后一个为在堆中新开辟的内存的对象的地址。这说明this指针的地址和对象的地址相同,但它是给成员函数用的。下面更改代码让getlen()返回arr1这个对象,在C++中要在一个函数中返回一个已经存在的全局变量或者一个实例化的
对象就需要引用,因为引用的作用就是返回它本身。
//array.h class array { public: array(int len); ~array(); void setlen(int len); array& getlen(); void printinfo(); private: int len; }; //array.cpp #include<iostream> #include"array.h" using namespace std; array::array(int len) { this->len=len; } array::~array() { } void array::setlen(int len) { this->len = len; } array& array::getlen() { return *this; } void array::printinfo() { cout<<" printinfo()"<<endl; } //main.cpp #include <iostream> #include <stdlib.h> #include"array.h" using namespace std; int main(int argc, char *argv[]) { array arr1(10); array *p =&arr1; array *p1=new array(10); //cout<<arr1.getlen().printinfo()<<endl; cout<<&arr1<<endl; cout<<p<<endl; cout<<p1<<endl; system("PAUSE"); return 0; }