精华内容
下载资源
问答
  • this指针的用法
    千次阅读
    2022-01-14 20:29:56

    目录

    一、this指针是什么、

    二、this指针的特性


    一、this指针是什么、

    class Date
    {
    public:
    	Date(int year=1,int month =1,int day=1)
    	{
    		this->_year = year;
    		this->_month = month;
    		this->_day = day;
    	}
    	void print()
    	{
    		cout << this->_year << " " << this->_month << " " << this->_day << endl;
    	}
    private:
    	int _year; // 年
    	int _month; // 月
    	int _day; // 日
    };
    
    int main()
    {
    	Date d1;
        Date d2;
    	d1.print();
        d2.print();
    	return 0;
    }

            对于上面这个日期类中的print成员函数,不同对象d1或d2调用,那么可以使用this指针来访问到该对象的私有的成员属性。方便理解我们可以写成下面的形式,相当于在print中我们传入对象的地址,来说明执行的是哪一个对象的函数。但实际上编译器不允许我们这么写。

    void print(/*Date* this*/)
    d1.print(/*&d1*/);

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

    二、this指针的特性

    1. this指针的类型:类类型* const,入上述的this指针类型为Date* const,指针指向的位置不能改变。

    2. 只能在“成员函数”的内部使用。

    3. this指针本质上其实是一个成员函数的形参,是对象调用成员函数时,将对象地址作为实参传递给this形参。所以对象中不存储this指针。this指针作为形参的话,存放位置一般在栈上,有的编译器为了提高效率会使用寄存器来存储this指针。

    4. this指针是成员函数第一个隐含的指针形参,一般情况由编译器通过ecx寄存器自动传递,不需要用户传递。

    5.this指针可以为空,只要不解引用。

    class A
    {
    public:
        void PrintA()
        {
            cout<<_a<<endl;
        }
        void Show()
        {
            cout<<"Show()"<<endl;
        }
        private:
        int _a;
    };
    
    int main()
    {
        A* p = nullptr;
        p->PrintA();
        p->Show();
    }

            将A类中的指针设为空指针后,我们调用PrintA函数会出错,应为函数中使用到了成员属性_a

    其中隐含了this指针的解引用,相当于this->_a,将空指针解引用就会出错。而调用Show函数就不会有这样的问题,也是因为其没有对this指针解引用。

    更多相关内容
  • C++中this指针用法详解及实例 概要: 本文简单介绍this指针的基本概念,并通过一个实际例子介绍this指针用于防止变量命名冲突和用于类中层叠式调用的两个用法。 this指针概览 C++中,每个类 对应了一个对象,每个...
  • 我知道很多朋友都和我一样:在JAVA程序中似乎经常见到“this”,自己也偶尔用到它,但是到底“this”该怎么用,却心中无数!很多人一提起它,就说“当前对象”,可到底什么是当前对象,是什么当前对象,他自己也不...
  • this指针只能在一个类的成员函数中调用,它表示当前对象的地址。下面是一个例子: 代码如下: void Date::setMonth( int mn ) { month = mn; // 这三句是等价的 this->month = mn; (*this).month = mn; } 1. this...
  • C++笔记 this指针用法

    2022-04-05 22:45:46
    一、this指针 引言: 首先,我们都知道类的成员函数可以访问类的数据(限定符只是限定于类外的一些操作,类内的一切对于成员函数来说都是透明的),那么成员函数如何知道哪个对象的数据成员要被操作呢,原因在于每个...

     一、this指针
    引言:
    首先,我们都知道类的成员函数可以访问类的数据(限定符只是限定于类外的一些操作,类内的一切对于成员函数来说都是透明的),那么成员函数如何知道哪个对象的数据成员要被操作呢,原因在于每个对象都拥有一个指针:this指针,通过this指针来访问自己的地址

    定义:
    在 C++ 中,每一个对象都能通过 this 指针来访问自己的地址。this 指针是所有成员函数的隐含参数。因此,在成员函数内部,它可以用来指向调用对象。
    注意事项:
    1、this指针并不是对象的一部分,this指针所占的内存大小是不会反应在sizeof操作符上的。this指针的类型取决于使用this指针的成员函数类型以及对象类型,

    2、this指针在成员函数的开始执行前构造的,在成员的执行结束后清除。

    /*   2022   04  05  */
    
    /*  this 指针 出现背景:  */
    //  当成员函数的形参名字和数据成员相同的时候,容易产生二义性
    //  this指针   通指  所有对象本身  的地址
    //  对象存在,this指针才能存在
    
    
    
    
    
    /*  this 指针定义 */
    //  在C++中,每一个对象都能通过 this 指针来访问自己的地址。
    //  this指针是所有成员函数的隐含参数。因此,在成员函数内部,它可以用来指向调用对象。
    #include<iostream>
    #include<string>
    using namespace std;
    class GrilFriend
    {
    public:
    	//  当成员函数的形参名字和数据成员相同的时候,容易产生二义性
    	void setData(string name, int age)
    	{
    
    		// 1、类名限定
    		GrilFriend::name = name;
    		GrilFriend::age = age;
    		// 2、用this表示对象的属性
    		cout << "this=    " << "\t"  << this << endl;
    		this->name = name;
    		this->age = age;
    	}
    	void print()
    	{
    		cout << "name=" << name << "\t" << "age=" << age<< endl;
    	}
    
    
    	/* this指针的用途  */
    	// 1、返回对象本身的成员函数
    	GrilFriend returnGrilFriend()
    	{
    	
    		return *this;
    	
    	
    	
    	}
    
    
    	// 2、返回对象地址的成员函数
    	GrilFriend *returnGrilFriendPoint()
    	{
    	
    		
    	
    		return this;
    	
    	
    	}
    
    
    
    
    
    
    
    
    protected:
    	string name = "baby";
    	int age = 18;
    
    
    private:
    
    
    
    
    
    
    };
    
    void test01()
    {
    	GrilFriend xf;
    	cout << "对象xf的地址:" << &xf << endl;
    	xf.setData("小芳",20); // this  &xf	
    	xf.print();
    	
    
    	cout << endl;
    	GrilFriend baby;
    	cout << "对象baby的地址:" << &baby << endl;
    	baby.setData("baby", 22);// this &baby
    	baby.print();
    
    
    
    
    	baby.returnGrilFriend().returnGrilFriend().returnGrilFriend().print();
    
    	baby.returnGrilFriendPoint()->returnGrilFriendPoint()->print();
    
    	
    
    
    
    
    }
    
    
    
    
    
    
    
    
    
    
    
    
    int main()
    {
    
    	
    
    	test01();
    	system("pause");
    	return 0;
    }
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    

     

    展开全文
  • this指针的作用和用法

    千次阅读 2021-07-28 13:32:34
    由于C++中成员变量和成员函数是分开存储的,所以每一个非静态成员函数只会诞生一份函数实例,就是多个同类型的对象会共用一块代码,如果需要让一块代码调用自己,可以用到this指针,this是C++提供的特殊的对象指针,...

    由于C++中成员变量和成员函数是分开存储的,所以每一个非静态成员函数只会诞生一份函数实例,就是多个同类型的对象会共用一块代码,如果需要让一块代码调用自己,可以用到this指针,this是C++提供的特殊的对象指针,不需要定义。

    this指针指向被调用的成员函数所属的对象

    第一个用途:当形参和成员变量同名时,可以用this指针来区分

    struct Member
    {
        Member(int score)
        {
            this->score=score; //this->成员变量 = 形参
        }
        int score;
    };
    int main()
    {
        Member n1(5);
        cout<<n1.score<<endl;  //5
    }
    

    当然如果形参和成员变量名字不一样时,也可以不使用this指针

    第二个用途:在类的非静态成员函数中返回对象本身,可使用return *this,用于链式编程

    struct Member
    {
        Member(int score)
        {
            this->score=score;
        }
    
        Member& AddScore(Member& n) 
        //这里如果不使用&的话,返回的虽然也是一个对象,但是这个对象不是n1了,是临时创建出来的对象
        {
            this->score+=n.score;
            return *this;
        }
        int score;
    };
    int main()
    {
        Member n1(5);
        Member n2(100);
        Member n3(30);
        n1.AddScore(n2); //5+100=105
        n1.AddScore(n2).AddScore(n3);//105+100+30=235
        cout<<n1.score<<endl;  //235
    }
    

    在这里插入图片描述
    由于AddScore()函数返回的是一个对象,对这个对象取引用,则这个对象也就是n1


    struct Member
    {
        Member(int score)
        {
            this->score=score;
        }
    
        Member AddScore(Member& n) 
        //这里没有使用引用,返回的虽然也是一个对象,但是这个对象不是n1了,是临时创建出来的对象
        {
            this->score+=n.score;
            return *this;
        }
        int score;
    };
    int main()
    {
        Member n1(5);
        Member n2(100);
        Member n3(30);
        n1.AddScore(n2); //5+100=105
    
    
        n1.AddScore(n2).AddScore(n3);//105+100=205
        cout<<n1.score<<endl;  //205
    }
    

    在这里插入图片描述
    由于AddScore()函数返回的是一个对象,但是没有引用,则这个对象也就不是n1了,而是临时创建出来的n1’,n1’中的AddScore()函数执行一次后返回的是n1’’

    展开全文
  • 主要介绍了C#中this指针用法,对初学者而言是非常重要的概念,必须加以熟练掌握,需要的朋友可以参考下
  • C++This指针用法

    2020-10-16 09:31:48
    C++This指针用法前言1.为什么要引入This指针2.This指针的补充3.This指针使用3.1返回对象本身3.2对成员属性的引用4.示例5.This指针的特点5.1 This指针只能在成员函数中使用5.2 This在成员函数的开始前构造,在...

    前言

    在上一篇博文中,对C++This指针的本质详细地讲解了,这篇博文主要是讲C++This指针的用法,应用场景等。

    1.为什么要引入This指针

    最简单的应用场景就是:当我们在类中定义了一个变量,同时在类成员函数中定义了同一变量时,也就是说变量名重复时,但是我们想使用类中定义的变量,这个时候我们该怎么办呢?这个时候就是this指针大显身手的时候了。为此我们引入this指针的概念。

    2.This指针的补充

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

    3.This指针的使用

    3.1返回对象本身

    对象调用成员函数,想返回对象本身,可以使用如下语法

    return *this
    

    可能有的人会疑惑,为什么要返回对象本身?
    返回对象本身的好处是可以进行链式调用函数,也很简便。

    3.2对成员属性的引用

    this->n = n (不能写成n = n)
    

    4.示例

    #include <iostream>
    #include <string>
    using namespace std;  
    
    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=" << endl};  
    void main( ) 
    {  
    Point point1( 10,10);  
    point1.MovePoint(2,2);  
    point1.print( );  
    }  
    

    this指针存在于类的成员函数中,指向被调用函数所在的类实例的地址。
    当对象point1调用MovePoint(2,2)函数时,即将point1对象的地址传递给了this指针。

    MovePoint函数的原型应该是 void MovePoint( Point * const 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;

    5.This指针的特点

    5.1 This指针只能在成员函数中使用

    全局函数、静态函数都不能使用this.

    实际上,成员函数默认第一个参数为T * const this。

    如:

    class A
    {
    public:
      int func(int p)
    
        {
    
        }
    
    };
    

    其中,func的原型在编译器看来应该是:

    int func(A * const this,int p);

    5.2 This在成员函数的开始前构造,在成员函数的结束后清除

    这个生命周期同任何一个函数的参数是一样的,没有任何区别。

    当调用一个类的成员函数时,编译器将类的指针作为函数的this参数传递进去。如:

    A a;

    a.func(10);

    此处,编译器将会编译成:

    A::func(&a,10);

    5.3 This指针存储位置

    this指针会因编译器不同而有不同的放置位置。可能是栈,也可能是寄存器,甚至全局区。在汇编级别里面,一个值只会以3种形式出现:立即数、寄存器值和内存变量值。不是存放在寄存器就是存放在内存中,它们并不是和高级语言变量对应的。

    5.4This指针是如何传递的

    This指针变量和其他变量不一样,函数形参都是创建于栈上
    而大多数编译器通过ecx寄存器传递this指针。

    注意:编译器是在创建对象的时候,向ecx寄存器传递This指针

    #include <iostream>
    #include <string>
    
    using namespace std;
    class  CTest
    {
    public:
        void  SetValue();
        int  m_iValue1;
        int  m_iValue2;
    };
    
    void  CTest::SetValue()
    {
        m_iValue1 = 13;
        m_iValue2 = 13;
    }
    int main()
    {
    
        CTest test;
        test.SetValue();
    
        return 0;
    }
    

    我们看下这个例程的汇编代码:
    在这里插入图片描述
    在创建test对象的时候,就是将test的地址传给了ecx。

    6.非静态成员函数调用方式

    This指针的作用域只在成员函数中,所以在类外是不能够出现This指针。

    #include <iostream>
    #include <string>
    
    
    using namespace std;
    class  CTest
    {
    public:
        void  SetValue();
    
    
        int  m_iValue1;
        int  m_iValue2;
    };
    
    void  CTest::SetValue()
    {
        this->m_iValue1 = 13; //通过指针引用
        this->m_iValue2 = 13; //通过指针引用
    }
    int main()
    {
    
        CTest test;
        test.SetValue();
    
        return 0;
    }
    

    6.1 通过指针调用

    #include <iostream>
    #include <string>
    
    
    using namespace std;
    class  CTest
    {
    public:
        void  SetValue();
    
    
        int  m_iValue1;
        int  m_iValue2;
    };
    
    void  CTest::SetValue()
    {
        m_iValue1 = 10;
        m_iValue2 = 13;
    }
    int main()
    {
    
        CTest test;
        CTest* ptest = &test;
        ptest->SetValue(); //通过指针的方式调用
        return 0;
    }
    

    6.2通过对象调用

    using namespace std;
    class  CTest
    {
    public:
        void  SetValue();
    
    
        int  m_iValue1;
        int  m_iValue2;
    };
    
    void  CTest::SetValue()
    {
        m_iValue1 = 10;
        m_iValue2 = 13;
    }
    int main()
    {
    
        CTest test;
        test.SetValue();//通过对象进行调用
    
        return 0;
    }
    

    7.总结

    本片博文主要是讲了C++This指针的用法,学了这篇文章后,你应该能够掌握This指针的用法。C++This指针是比较难但又是很重要的。自己在汇编层面还是比较欠缺,所以学好C++和C,就得学好计算机底层,就得学好汇编!
    加油吧,路在脚下!

    展开全文
  • C#this指针用法

    2012-08-20 11:56:47
    简单介绍了C#中this指针用法
  • this指针用法及其深究

    2021-08-18 23:19:57
    文章目录前言一、this指针是个什么东东,重要吗?二、案例理解主要的用途总结 前言 今天,码神像一个新车手一样,尝试着用模板来更新一下,不要建议哦,毕竟没有放弃爱情的拓海也不是真正的车神,哈哈,发车了 一、...
  • C++中this指针用法详解

    千次阅读 2019-08-31 10:28:02
    1. this指针的用处:  一个对象的this指针并不是对象本身的一部分,不会影响sizeof(对象)的结果。this作用域是在类内部,当在类的非静态成员函数中访问类的非静态成员的时候,编译器会自动将对象本身的地址作为一个...
  • this指针用法

    2017-05-05 19:40:08
    this指针是这样一个指针,它时刻指向这个实例本身。   1 this指针本质是一个函数参数,只是编译器隐藏起形式的,语法层面上的参数。this只能在成员函数中使用,全局函数,静态函数都不能使用this。 2 this在...
  • C++中this指针用法

    2018-11-04 00:13:49
    this指针只能在类的成员函数中调用,表示当前对象的地址; 这篇文档介绍了this指针用法、概念; this指针相对简单,只需牢记概念即可。
  • this指针用法和基本分析

    千次阅读 2019-09-09 22:13:57
    this 指针
  • this指针2.1 前言(this指针的引出)2.2 什么是this指针 1. const的使用 const的使用有以下四种情况: const int* p int const *p int* const p const int* const p 我们可以通过以下图解来理解这四种情况const...
  • this的使用方法 this经常被大家伙叫成this指针,而也就是这个称呼,体现出了它的作用,指向什么东西,指向某一项数据 this指针的指向一直遵循一个原则: this永远指向的是最后调用它的对象 说完this的指向,后面就是...
  • java中的this指针有两种用法,一是用在构造函数中,二是用在公用方法中。定义:是一个系统隐含的指针,被自动附加在非静态的成员函数的参数列表中。(静态函数内部没有this指针)1.在构造函数中的用法用来把参数赋值...
  • 二、成员函数重载 成员函数原型的格式: 函数类型 operator 运算符(参数表); 成员函数定义的格式: 函数类型 类名::operator 运算符(参数表) ...this指针除了用于返回当前对象外,还经常出现在非静态的函数成员中。...
  • QT中this指针

    万次阅读 多人点赞 2017-08-01 20:58:12
    一:this指针只能在一个类的成员函数中调用,它表示当前对象的地址。下面是一个例子:  void Date::setMonth( int mn )  {  month = mn; // 这三句是等价的  this->month = mn;  (*this)....
  • this指针用法详解

    2015-02-13 21:23:18
    C++中this指针用法详解 2010-11-12 20:40:45 分类: C/C++   1. this指针的用处:  一个对象的this指针并不是对象本身的一部分,不会影响sizeof(对象)的结果。this作用域是在类内部,当在类的非静态...
  • C++ this指针显式使用

    2021-06-10 20:31:45
    this指针显式使用 上面我们介绍了this指针对象的定义。知道在对象的成员函数中,是通过this指针对象来访问成员变量和成员函数。
  • C++ this指针使用

    2022-03-07 11:22:24
    当形参和成员变量同名时,可用this指针来区分 ##在C++类中我们编写成员函数过程中,我们通常会将类中的属性名(例 int age)与构造函数或成员函数中的参数名做区分, 以避免形参名与属性名相同而带来程序运行的错误...
  • C++this 指针用法详解

    千次阅读 2015-04-14 23:11:37
    1. this指针的用处:  一个对象的this指针并不是对象本身的一部分,不会影响sizeof(对象)的结果。this作用域是在类内部,当在类的非静态成员函数中访问类的非静态成员的时候,编译器会自动将对象本身的地址作为一个...
  • C++ this指针详解

    千次阅读 2021-05-24 03:04:22
    下面是小编为大家整理的C++ this指针详解,欢迎参考~C++ this指针详解所谓当前对象,是指正在使用的对象。例如对于stu.show();,stu 就是当前对象,this 就指向 stu。下面是使用 this 的一个完整示例:#includeusing...
  • this指针详解

    2022-03-20 08:20:32
    this指针只能在成员函数中使用,在全局函数、静态成员函数中都不能用this。 this指针只有在成员函数中才有定义,且存储位置会因编译器不同有不同存储位置。 this指针的用处 一个对象的this指针并不是对象本身的一...
  • 理解this指针

    2022-03-04 12:34:44
    文章目录一、this指针的引入二、this指针的特点三、this指针放在哪里?this指针可以为空吗?四、注意 一、this指针的引入 class Date{ public: void Display() { cout << _year << "-" << _...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 393,490
精华内容 157,396
关键字:

this指针的用法