精华内容
下载资源
问答
  • this指针存在的目的
    千次阅读
    2018-08-02 11:37:56

    先要理解class的意思。class应该理解为一种类型,象int,char一样,是用户自定义的类型。用这个类型可以来声明一个变量,比如int x, myclass my等等。这样就像变量x具有int类型一样,变量my具有myclass类型。理解了这个,就好解释this了,my里的this 就是指向my的指针。如果还有一个变量myclass mz,mz的this就是指向mz的指针。 这样就很容易理解this 的类型应该是myclass *,而对其的解引用*this就应该是一个myclass类型的变量。

    通常在class定义时要用到类型变量自身时,因为这时候还不知道变量名(为了通用也不可能固定实际的变量名),就用this这样的指针来使用变量自身。 

    1. this指针的用处:

    一个对象的this指针并不是对象本身的一部分,不会影响sizeof(对象)的结果。

    this作用域是在类内部,当在类的非静态成员函数中访问类的非静态成员的时候,编译器会自动将对象本身的地址作为一个隐含参数传递给函数。也就是说,即使你没有写上this指针,编译器在编译的时候也是加上this的,它作为非静态成员函数的隐含形参,对各成员的访问均通过this进行。例如,调用date.SetMonth(9) <===> SetMonth(&date, 9),this帮助完成了这一转换 .

    在成员函数内部,我们可以直接使用调用该函数的对象的成员,而无需通过成员访问运算符来做到这一点,因为this所指的正是这个对象。任何对类成员的直接访问都被看成this的隐式使用。

    this的目的总是指向这个对象,所以this是一个常量指针,我们不允许改变this中保存的地址

    2. this指针的使用:

    一种情况就是,在类的非静态成员函数中返回类对象本身的时候,直接使用 return *this;另外一种情况是当参数与成员变量名相同时,如this->n = n (不能写成n = n)。 

    3. 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指针存在的意义

    千次阅读 2020-06-29 18:42:14
    } 小问题: this指针存在哪里?也就是存在进程地址空间的哪个区域? 存在栈上,因为它是一个形参。(VS下存在ecx寄存器里来传递) this指针可以为空吗? 可以为空,在调用函数的时候,如果函数内部没有使用到this...

    首先,我们先来看一个Date类:

    #include <iostream>
    using namespace std;
    
    class Date
    {
    public:
        void Init(int year, int month, int day)
        {
            _year = year;
            _month = month;
            _day = day;
        }
    
        void Print()
        {
            cout << _year << "-" << _month << "-" << _day << endl;
        }
    private:
        int _year;
        int _month;
        int _day;
    };
    
    int main()
    {
        Date d1;
        d1.Init(2020, 6, 29);
        d1.Print();
    
        Date d2;
        d2.Init(2020, 6, 29);
        d2.Print();
        return 0;
    }
    

    对于上述类,有这样一个问题:
    Date类中有 Init 与 Print 两个成员函数,函数体中没有关于不同对象的区分,那当 d1 调用 Init 函数时,该函数是如何知道应该设置 d1 对象,而不是设置 d2 对象呢?
        C++中通过引入 this 指针解决该问题,即:C++编译器给每个“非静态的成员函数“增加了一个隐藏的指针参数,让该指针指向当前对象(函数运行时调用该函数的对象),在函数体中所有成员变量的操作,都是通过该指针去访问。只不过所有的操作对用户是透明的,即用户不需要来传递,编译器自动完成。
        C++中的成员函数参数中不允许显式的写 this 指针,只能在成员函数的内部使用
        this 指针的类型:类类型* const
    this指针

    #include <iostream>
    using namespace std;
    
    class Date
    {
    public:
        //void Init(Date* this, int year, int month, int day);
        void Init(int year, int month, int day)
        {
            //this->_year = year;
            //this->_month = month;
            //this->_day = day;
            _year = year;
            _month = month;
            _day = day;
        }
    
        //void Print(Date* this);
        void Print()
        {
            //cout << this->_year << "-" << this->_month << "-" << this->_day << endl;
            cout << _year << "-" << _month << "-" << _day << endl;
        }
    private:
        int _year;
        int _month;
        int _day;
    };
    
    int main()
    {
        Date d1;
        d1.Init(2020, 6, 29); //d1.Init(&d1, 2020, 6, 4);
        d1.Print(); //d1.Print(&d1);
    
        Date d2;
        d2.Init(2020, 6, 29); //d2.Init(&d2, 2020, 6, 4);
        d2.Print(); //d2.Print(&d2);
        return 0;
    }
    

    小问题:

    1. this指针存在哪里?也就是存在进程地址空间的哪个区域?
      存在栈上,因为它是一个形参。(VS下存在ecx寄存器里来传递)
    2. this指针可以为空吗?
      可以为空,在调用函数的时候,如果函数内部没有使用到this指针去访问成员变量;如果函数内部需要用到this指针去访问成员变量,则不能为空。
    展开全文
  • 在这里就引出了this指针。 C++编译器给每个 “非静态的成员函数” 增加了一个隐藏的指针参数,让该指针指向当前对象(函数运行时调用该函数的对象),在函数体中所有成员变量的操作,都是通过这个指针来完成的。只不过...

    在这篇文章中 初识类和对象,谈到了类的初步认识和基本操作方法。

    成员函数存储在公共的代码段,不同的对象调用成员函数时候,那么编译器如何知道具体操作的是哪一个对象呢?
    在这里就引出了this指针。

    C++编译器给每个 “非静态的成员函数” 增加了一个隐藏的指针参数,让该指针指向当前对象(函数运行时调用该函数的对象),在函数体中所有成员变量的操作,都是通过这个指针来完成的。只不过所有的操作对用户来说都是透明的,不需要用户来传递,编译器自动完成。
     
     
     
    this指针特性:

    1. 只能在“成员函数”中使用
    2. this指针类型: 类类型 *const (加const是为了保证,指针的指向不被更改)
    3. this指针不存储在对象中,不影响对象大小,且始终指向当前对象
    4. this指针是“成员函数”的第一个隐藏参数,由编译器自动给出
    5. 主要是通过ecx寄存器来传递(并不是所有的)

    例:

    class Student
    {
    private:
    	char _name[20];
    	char _sex[5];
    	int _age;
    public:
    	void StudentInit(const char *name, const char *sex, int age);
    	void Print();
    };
    

    其操作方法:
    在这里插入图片描述
    其最后的输出都是一样的,因为this为隐藏指针,编译器会自动加上。
    在这里插入图片描述
     
     
     
    this指针可以为空嘛?

    1. 当以对象调用成员函数时,this指针不可能为空。
    2. 当以指针ptr调用成员函数时,是将ptr作为参数传递给this指针,若ptr为空,那么this指针就为nullptr
    3. this指针为空,成员函数可以正常调用。但若是成员函数访问了成员变量或者调用了有成员变量的成员函数,程序会崩溃。

     
     
     
    成员变量相当于成员函数的全局变量。

    但是成员变量在后,成员变量的使用在前,编译器为什么不报错呢?

    编译器处理类的方法:

    1. 识别类名
    2. 识别成员变量
    3. 识别成员函数,并对函数进行修改----增加this指针
    展开全文
  • C++中类成员函数中的this指针

    千次阅读 2019-05-12 20:50:39
    先要理解class的意思。class应该理解为一种类型,象int,char一样,是用户...理解了这个,就好解释this了,my里的this 就是指向my的指针。如果还有一个变量myclass mz,mz的this就是指向mz的指针。 这样就很容易理解...

    先要理解class的意思。class应该理解为一种类型,象int,char一样,是用户自定义的类型。用这个类型可以来声明一个变量,比如int x, myclass my等等。这样就像变量x具有int类型一样,变量my具有myclass类型。理解了这个,就好解释this了,my里的this 就是指向my的指针。如果还有一个变量myclass mz,mz的this就是指向mz的指针。 这样就很容易理解this 的类型应该是myclass *,而对其的解引用*this就应该是一个myclass类型的变量。

    通常在class定义时要用到类型变量自身时,因为这时候还不知道变量名(为了通用也不可能固定实际的变量名),就用this这样的指针来使用变量自身。 

    1. this指针的用处:

    一个对象的this指针并不是对象本身的一部分,不会影响sizeof(对象)的结果。

    this作用域是在类内部,当在类的非静态成员函数中访问类的非静态成员的时候,编译器会自动将对象本身的地址作为一个隐含参数传递给函数。也就是说,即使你没有写上this指针,编译器在编译的时候也是加上this的,它作为非静态成员函数的隐含形参,对各成员的访问均通过this进行。例如,调用date.SetMonth(9) <===> SetMonth(&date, 9),this帮助完成了这一转换 .

    在成员函数内部,我们可以直接使用调用该函数的对象的成员,而无需通过成员访问运算符来做到这一点,因为this所指的正是这个对象。任何对类成员的直接访问都被看成this的隐式使用。

    this的目的总是指向这个对象,所以this是一个常量指针,我们不允许改变this中保存的地址

    2. this指针的使用:

    一种情况就是,在类的非静态成员函数中返回类对象本身的时候,直接使用 return *this;另外一种情况是当参数与成员变量名相同时,如this->n = n (不能写成n = n)。 

    3. this指针程序示例:

    this指针是存在与类的成员函数中,指向被调用函数所在的类实例的地址。

    根据以下程序来说明this指针

    #include<iostream.h>
    class Point
    { 
      int x, y;
    public:
      Point(int a, int b) { x=a; y=b;}
      Void MovePoint( int a, int b){ x+=a; y+=b;}
      Void print(){ cout<<"x="<<x<<"y="<<y<<endl;}
    };
    void main( )
    {
       Point point1( 10,10);
       point1.MovePoint(2,2);
       point1.print( );
    }

    当对象point1调用MovePoint(2,2)函数时,即将point1对象的地址传递给了this指针。
    MovePoint函数的原型应该是 void MovePoint( Point *this, int a, int b);第一个参数是指向该类对象的一个指针,我们在定义成员函数时没看见是因为这个参数在类中是隐含的。这样point1的地址传递给了this,所以在MovePoint函数中便显式的写成:
    void MovePoint(int a, int b) { this->x +=a; this-> y+= b;}
    即可以知道,point1调用该函数后,也就是point1的数据成员被调用并更新了值。
    即该函数过程可写成 point1.x+= a; point1. y + = b;

     

    4. 关于this指针的一个精典回答:

    当你进入一个房子后,
    你可以看见桌子、椅子、地板等,
    但是房子你是看不到全貌了。

    对于一个类的实例来说,
    你可以看到它的成员函数、成员变量,
    但是实例本身呢?
    this是一个指针,它时时刻刻指向你这个实例本身。

    转自:http://blog.csdn.net/chenyt01/article/details/51316022

    this指针基础介绍

    =================this指针的由来====================

          一个学生可以有多本书一样,而这些书都是属于这个同学的;同理,如果有很多个同学在一起,那么为了确定他们的书不要拿混淆了,最好的办法我想应该就是每个同学都在自己的书上写上名字,这样肯定就不会拿错了。

          同理,一个对象的多个成员就可看作是这个对象所拥有的书;而在很多个对象中间,我们为了证明某个成员是自己的成员,而不是其他对象的成员,我们同样需要给这些成员取上名字。在C++中,我们利用this指针帮助对象做到这一点,this指针记录每个对象的内存地址,然后通过运算符->访问该对象的成员。

    =================this指针作用示例====================

          二话不说!我们通过一个程序来体现this指针的实际用处:

    #include <iostream>
    using namespace std;
     
    class A
    {
    public:
        int get() const{return i;}
        void set(int x){this->i=x;cout<<"this指针保存的内存地址为:"<<this<<endl;}
    private:
        int i;
    };
     
    int main()
    {
        A a;
        a.set(9);
        cout<<"对象a所在的内存地址为:"<<&a<<endl;
        cout<<"对象a所保存的值为:"<<a.get()<<endl;
        cout<<endl;
        A b;
        b.set(999);
        cout<<"对象b所在的内存地址为:"<<&b<<endl;
        cout<<"对象b所保存的值为:"<<b.get()<<endl;
        return 0;
    }

    这个程序的输出如下:

    通过这个输出结果,我们可以看到,对象a的内存地址和this指针的一模一样(都是0017F7E8);而当运行到对象b的时候,它的内存地址又和它所对应的this指针指向的内存地址一模一样了(都是0017F7DC)。这就说明了this指针变量记录的是当前对象的内存地址,即this指针指向当前的对象!

          在程序的第8行,我们就用了this指针的这个属性,即:this->i=x;这句话就表示把x的值赋值给当前的对象的私有成员函数i。

          所以,综上所述,通过上面这个例子,我们可以看到this指针最大的作用就是它保存了当前对象的地址,并且应用指针的形式指向了当前的对象。

    展开全文
  • C++:默认成员函数和this指针

    千次阅读 2018-07-31 17:57:27
    this指针
  • 原文链接:this指针 运算符重载(operator) this指针 this指针是成员函数的一个隐式参数,在类中本质上就是对象的指针(常量指针) 特点: 在成员函数中可通过this指针区别成员变量与形参变量 this可以显示调用 ...
  • 深入探讨C++的this指针

    2010-12-29 11:25:56
    this指针作为一个隐含参数传递给非静态成员函数,用以指向该成员函数所属类所定义的对象
  • C++中的this指针与python中的self

    千次阅读 2019-02-14 15:29:37
    C++类中this指针的理解 先要理解class的意思。class应该理解为一种类型,象int,char一样,是用户自定义的类型。用这个类型可以来声明一个变量,比如int x, myclass my等等。这样就像变量x具有int类型一样,变量my...
  • 感知this指针 人工传递this指针技巧

    千次阅读 2012-05-16 11:14:09
    在普通类方法ShowMember中,打印私有成员变量m_nPrivateMember,这里故意显式地使用this指针来引用它,目的是与静态类方法StaticShowMember形成对比。在StaicShowMember方法中,调用this->ShowMember()是非法的,...
  • 简单无理的的测试代码:#include #include using namespace std; class A { public: int x; int y; public: A() ... cout构造函数A传入的this指针得值是:"<<std::hex<<std::showbase<<this; }
  • js中的function函数对象和this指针详解

    千次阅读 2014-11-06 10:32:41
    由此可见,尽管JavaScript是一门解释型的语言,但它会在函数调用时,检查整个代码中是否存在相应的函数定义,这个函数名只有是通过function funcName()形式定义的才会有效,而不能是匿名函数。 函数对象和...
  • C++ 智能指针 - 全部用法详解

    千次阅读 多人点赞 2021-07-19 19:43:29
    血的教训?不学智能指针,本人丢了一份工作。
  • 我们先来看看this指针。之前看过一篇关于this指针的文章,觉得写的很好,今天决定自己来写一写,顺便总结一下C++里面关于类的一些内容。  什么是this指针呢?简单的说它是一个指向类的实例的指针,就好像当我们在...
  • c++11 智能指针

    千次阅读 2021-11-20 21:36:32
    一、智能指针 c++程序设计中经常会用堆内存,程序员要自己管理内存的申请和释放。使用原始指针,容易造成堆内存泄漏(忘记释放),二次释放;使用智能指针能更好的管理堆内存。 c++中四个智能指针:auto_ptr,unique...
  • C++智能指针(详细介绍)

    千次阅读 2021-03-07 20:02:19
    前言 C++里面的四个智能指针: auto_ptr, unique_ptr,shared_ptr, weak_ptr 其中后三个是C++11支持,并且第一个已经被C++11弃用。 C++11智能指针介绍 ...该引用计数的内存在堆上分配。当新增一个
  • 首先一般获得本类(视,文档,对话框都支持)实例指针 this,用this目的,主要可以通过类中的函数向其他类或者函数中发指针,以便于在非本类中操作和使用本类中的功能。   这其中的关键在于理解 m_pMainWnd, ...
  • 指针与引用总结

    千次阅读 多人点赞 2018-10-15 22:58:07
    指针 若现在指针不知道指向,可以使用NULL,例如int *b = NULL; char *a = NULL;,但是使用的时候若指针指向的是数组或者字符串等,需要提前声明大小。若是int *,则不需要,直接将一个int类型的指针赋值给它即可。 ...
  • c语言指针详解

    千次阅读 2018-09-18 20:56:47
    c语言指针详解 指针是C语言中广泛使用的一种数据类型。 运用指针编程是C语言最主要的风格之一。利用指针变量可以表示各种数据结构; 能很方便地使用数组和字符串; 并能象汇编语言一样处理内存地址,从而编出精练...
  • 智能指针与引用计数详解(一)

    千次阅读 多人点赞 2018-12-10 22:25:38
    在C++项目开发中,有时候会遇到悬垂指针的问题,其中提供的解决方案推荐使用智能指针。 在《C++Primer》书13.5章 提到了该技术的具体使用场景和实现。通过反复阅读和代码测试终于了解其中的思想,下面谈谈自己的...
  • C++指针详解

    千次阅读 2016-08-27 21:04:57
    指针的概念 ...要搞清一个指针需要搞清指针的四方面的内容:指针的类型,指针所指向的类型,指针的值或者叫指针所指向的内存区,还有指针本身所占据的内存区。让我们分别说明。  先声明几个指针
  • 初识指针

    千次阅读 2017-03-11 16:49:58
    要搞清一个指针需要搞清指针的四方面的内容:指针的类型,指针所指向的类型,指针的值或者叫指针所指向的内存区,还有指针本身所占据的内存区。让我们分别说明。 先声明几个指针放着做例子: 例一: int *ptr; char...
  • 悬垂指针(野指针

    千次阅读 2017-06-29 11:18:17
     一、迷途指针(悬垂指针)  在计算机编程领域中,... 当所指向的对象被释放或者收回,但是对该指针没有作任何的修改,以至于该指针仍旧指向已经回收的内存地址,此情况下该指针便称迷途指针(悬垂指针)。
  • C++ 一篇文章让你知道智能指针的魅力

    千次阅读 多人点赞 2021-05-31 14:28:40
    在C++中,动态内存的管理是用一对运算符完成的:new和delete,ne:在动态内存中为对象分配一块空间并返回一个指向该对象的指针,delete指向一个动态独享的指针,销毁对象,并释放与之关联的内存。 动态内存管理经常会...
  • c++类中的各种成员-嵌套类、友元和this指针
  • 指针

    千次阅读 多人点赞 2016-08-22 17:49:23
    要搞清一个指针需要搞清指针的四方面的内容:指针的类型,指针所指向的类型,指针的值或者叫指针所指向的内存区,还有指针本身所占据的内存区。让我们分别说明。  先声明几个指针放着做例子:  例一:  ...
  • 指针理解,很经典

    千次阅读 多人点赞 2018-04-25 10:39:05
    要搞清一个指针需要搞清指针的四方面的内容:指针的类型,指针所指向的类型,指针的值或者叫指针所指向的内存区,还有指针本身所占据的内存区。让我们分别说明。  先声明几个指针放着做例子:  例一:  ...
  • 【C++】智能指针的分析

    千次阅读 2019-03-25 09:58:11
    文章目录来源引入智能指针问题要求解决方案智能指针总结C++11中的智能指针原理、使用、实现智能指针的作用智能指针的使用shared_ptr的使用例程unique_ptr的使用例程weak_ptr的使用例程循环引用智能指针的设计和实现...
  • 深入实践C++11智能指针

    千次阅读 多人点赞 2021-08-15 23:10:26
    C/C++ 语言最为人所诟病的特性之一就是存在内存泄露问题,因此后来的大多数语言都提供了内置内存分配与释放功能,有的甚至干脆对语言的使用者屏蔽了内存指针这一概念。这里不置贬褒,手动分配内存与手动释放内存有利...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 95,262
精华内容 38,104
关键字:

this指针存在的目的