C++的 this 指针

   现在还是没有找到合适的工作啊,心情有点郁闷,时阴时晴的。不过有时候刹那间想想一岁多点的吾儿,心里面还是满温馨的。好了,闲话不多说,今天给大家分享一下我对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;
}
 
 

猜你喜欢

转载自www.cnblogs.com/yerhu/p/11405172.html