精华内容
下载资源
问答
  • this指针的作用
    千次阅读
    2019-03-22 22:43:32
    1. this 指针是一个隐含于每一个成员函数中的特殊指针。它指向正在被该成员函数操作的那个对象。
    2. 当对一个对象调用成员函数时,编译程序先将对象的地址赋给 this 指针,然后调用成员函数,每次成员函数存取数据成员时,由隐含使用 this 指针。
    3. 当一个成员函数被调用时,自动向它传递一个隐含的参数,该参数是一个指向这个成员函数所在的对象的指针。
    4. this 指针被隐含地声明为: ClassName const this,这意味着不能给 this 指针赋值;在 ClassName 类的 const 成员函数中,this 指针的类型为:const ClassName const,这说明不能对 this 指针所指向的这种对象是不可修改的(即不能对这种对象的数据成员进行赋值操作);
    5. 由于 this 并不是一个常规变量,所以,不能取得 this 的地址。
    6. 在以下场景中,经常需要显式引用 this 指针: 1. 为实现对象的链式引用; 2. 为避免对同一对象进行赋值操作; 3. 在实现一些数据结构时,如 list。
    更多相关内容
  • 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++ 代码转换成 C 的代码 class Car { public: int m_price; // 成员变量 void SetPrice(int p) // 成员函数 { m_price = p; } }; int main() { Car car; car....
  • C++this指针的用途

    2021-01-25 18:01:29
    this指针的用途: 1.当形参和成员变量同名时,可用this指针来区分。 2.在类的非静态成员函数中返回对象本身,可使用return *this 每一个非静态成员函数只会诞生一份函数实例,也就是说多个同类型的对象会共用一块...

    this指针的用途:
    1.当形参和成员变量同名时,可用this指针来区分。
    2.在类的非静态成员函数中返回对象本身,可使用return *this

    每一个非静态成员函数只会诞生一份函数实例,也就是说多个同类型的对象会共用一块代码,那么问题是:
    这一块代码是如何区分哪个对象调用自己的呢?

    C++通过提供特殊的对象指针,this指针解决上述问题。
    在这里插入图片描述
    对象p1,p2,p3都要调用这个函数,怎么区分是谁调用的呢?
    用this指针解决这个问题

    this指针指向被调用的成员函数所属的对象
    简单来说,谁调用这个函数,this指针就指向谁。

    1.this指针是隐含每一个非静态成员函数内的一种指针。
    2.this指针不需要定义,直接使用即可。

    1、解决名称冲突:
    现在让我们看一下名称冲突问题:

    #include <iostream>
    using namespace std;
    
    class Person {
    	public:
    		Person(int age) {
    			age = age;
    		}
    		int age;
    
    };
    
    
    //1.解决名称冲突
    
    void test01() {
    	Person p1(18);
    	cout << "p1的年龄为:" << p1.age << endl;
    
    }
    //2.返回对象本身用*this
    
    int main() {
    	test01();
    
    
    	return 0;
    }
    

    结果为0,如果你用的编译器是vs,结果应该是乱码,我用的是Dev-C++。

    在这里插入图片描述

    编译器会认为这3个age是同一个age,跟你这个属性age不是一回事,所以我们从来没有给这个属性age进行赋值操作。

    解决方法:
    1.成员属性和我们传入的形参名称不要同名。
    2.使用this指针。

    如何使用this指针呢?
    代码如下:

    #include <iostream>
    using namespace std;
    
    class Person {
    	public:
    		Person(int age) {
    			//this指针指向的是被调用成员函数所属对象
    			this->age = age;
    		}
    		int age;
    
    };
    
    
    //1.解决名称冲突
    
    void test01() {
    	Person p1(18);
    	cout << "p1的年龄为:" << p1.age << endl;
    
    }
    //2.返回对象本身用*this
    
    int main() {
    	test01();
    
    
    	return 0;
    }
    

    在这里插入图片描述
    此时编译器就这样认为了,所以就解决了这个问题。

    2、返回对象本身用*this
    首先先看这样一段代码:

    #include <iostream>
    using namespace std;
    
    class Person {
    	public:
    		Person(int age) {
    			this->age = age;
    		}
    		int age;
    
    		void PersonADDAge(Person &p) {
    			this->age += p.age;
    		}
    
    };
    
    
    //1.解决名称冲突
    
    //void test01() {
    //	Person p1(18);
    //	cout << "p1的年龄为:" << p1.age << endl;
    //
    //}
    //2.返回对象本身用*this
    
    void test02() {
    	Person p1(10);
    
    	Person p2(10);
    
    	p2.PersonADDAge(p1).PersonADDAge(p1).PersonADDAge(p1);
    
    	cout << "p2的年龄为:" << p2.age << endl;
    
    }
    
    
    int main() {
    //	test01();
    
    	test02();
    
    
    	return 0;
    }
    

    我们的目的是让p2加3次p1的年龄,想要的p2年龄返回结果为40,可编译器报错,这是为什么呢?

    在这里插入图片描述
    因为我们第一次调用PersonADDAge这个函数后,返回的是void,所以就不能再调用这个PersonADDAge函数了,那如果我们可以让第一次调用这个函数后的返回值仍然是p2,那就可以再次调用这个函数,那我们要如何实现呢?
    使用this指针。

    代码如下:

    #include <iostream>
    using namespace std;
    
    class Person {
    	public:
    		Person(int age) {
    			this->age = age;
    		}
    		int age;
    		//如果要返回本体,要用引用的方式返回。
    		Person &PersonADDAge(Person &p) {
    			this->age += p.age;
    			//this指向p2的指针,而*this指向的就是p2这个对象本体。
    			return *this;
    		}
    
    };
    
    
    //1.解决名称冲突
    
    //void test01() {
    //	Person p1(18);
    //	cout << "p1的年龄为:" << p1.age << endl;
    //
    //}
    //2.返回对象本身用*this
    
    void test02() {
    	Person p1(10);
    
    	Person p2(10);
    	
    	//链式编程思想
    	p2.PersonADDAge(p1).PersonADDAge(p1).PersonADDAge(p1);
    
    	cout << "p2的年龄为:" << p2.age << endl;
    
    }
    
    
    int main() {
    //	test01();
    
    	test02();
    
    
    	return 0;
    }
    

    此时的结果就是40了。
    那为什么要用引用呢?
    引用指向本身内存,不用引用就是拷贝了,而拷贝指向另一个内存。

    这里返回的不是指针或者引用,因为前面加了,所以返回的是p2本体。*

    在这里插入图片描述
    这个时候我们把这个引用删除,看看结果又是多少?
    结果为:20

    为什么呢?
    在这里插入图片描述

    因为此时返回的是一个拷贝的数据,每一次返回都是一个新的对象。

    所以最后就第一次调用对真正的p2产生影响,所以结果为20

    展开全文
  • C++中this指针用法详解及实例 概要: 本文简单介绍this指针的基本概念,并通过一个实际例子介绍this指针用于防止变量命名冲突和用于类中层叠式调用的两个用法。 this指针概览 C++中,每个类 对应了一个对象,每个...
  • C++ this 指针详解 学习 C++ 的指针既简单又有趣。通过指针,可以简化一些 C++ 编程任务的执行,还有一些...全局仅有一个this指针,当一个对象被创建时,this指针就存放指向对象数据的首地址。 class Ctest { publi
  • C++ this指针的理解和作用

    千次阅读 2019-11-28 23:36:52
    要想理解 C++ 的 this 指针,我们先把下面的 C++ 代码转换成 C 的代码 class Car { public: int m_price; // 成员变量 void SetPrice(int p) // 成员函数 { m_price = p; } }; int main() { ...

    微信公众号:「小林coding」
    用简洁的方式,分享编程小知识。

    01 C++ 程序到 C 程序的翻译

    要想理解 C++ 的 this 指针,我们先把下面的 C++ 代码转换成 C 的代码

    class Car 
    {
    public:
    	int m_price;         // 成员变量
    	void SetPrice(int p) // 成员函数
    	{
    	    m_price = p; 
    	}
    };
    
    int main()
    {
    	Car car;
    	car.SetPrice(20000); // 给car对象m_price成员变量赋值
    	
    	return 0;
    }
    

    C 语言是没有类定义的class关键词,但是有跟class类似的定义,那就是结构体struct

    m_price变量是Car类的成员变量,那么我们可以把Car类和成员变量翻译成如下的 C 代码:

    // 结构体Car
    struct Car
    {
        // price变量是属于Car结构体这个域里的变量
        int price;  
    };
    

    SetPrice函数是Car类的成员函数,但是 C 程序里是没有成员函数这种概念的,所以只能把成员函数翻译成全局的函数:

    // 参数1:结构体Car的指针
    // 参数2:要设置的价格变量
    void SetPrice(struct Car* this, int p)
    { 
        this->price = p;  // 将传入的Car结构体的price变量赋值
    }
    

    为什么要加个 this 的指针呢?我们继续往下看。

    在这里我们把上面main函数下面的 C++ 程序翻译 C 程序是这样的:

    int main() 
    {
        struct Car car;
        SetPrice( &car, 20000);
        return 0;
    }
    

    所以最终把上述的 C++程序 转换成C 程序的代码如下:

    struct Car
    {
        int price;  
    };
    
    
    void SetPrice(struct Car* this, int p)
    { 
        this->price = p; 
    }
    
    int main() 
    {
        struct Car car;
        SetPrice( &car, 20000); // 给car结构体的price变量赋值
        return 0;
    }
    

    02 this指针的作用

    其作用就是指向成员函数所作用的对象,
    所以非静态成员函数中可以直接使用 this 来代表指向该函数作用的对象的指针。

    #include <iostream>
    
    class Car 
    {
    public:
    	int m_price;
    	
    	void PrintPrice()
    	{
    		std::cout << m_price << std::endl;	
    	}
    	
    	void SetPrice(int p)
    	{
    		this->m_price = p; // 等价于 m_price = p;
    		this->PrintPrice();// 等价于 PrintPrice();
    	}
    	
    	Car GetCar()
    	{
    	    return *this; // 返回该函数作用的对象
    	}
    };
    
    int main(void)
    {
    	Car car1, car2;
    	car1.SetPrice(20000);
    	
    	// GetCar()成员函数返回所作用的car1对象,所把返回的car1赋值给了car2
    	car2 = car1.GetCar(); 
    	car2.PrintPrice();   
    	
    	return 0;
    }
    

    输出结果:

    20000
    20000
    

    接下来我们下面的代码,你觉得输出结果是什么呢?会出错吗?

    class A
    {
        int i;
        public:
        void Hello() { cout << "hello" << endl; }
    };
    
    int main()
    {
        A * p = NULL;
        p->Hello(); //结果会怎样?
    }
    

    答案是正常输出hello,你可能会好奇明明 p 指针是空的,不应该是会程序奔溃吗?别着急,我们先把上面的代码转换C程序,就能理解为什么能正常运行了。

    void Hello() { cout << "hello" << endl; } 
    # 成员函数相当于如下形式:
    void Hello(A * this ) { cout << "hello" << endl; }
    
    p->Hello(); 
    # 执行Hello()形式相当于:
    Hello(p);
    

    所以,实际上每个成员函数的第一个参数默认都有个指向对象的 this 指针,上述情况下如果该指向的对象是空,相当于成员函数的第一个参数是NULL,那么只要成员函数没有使用到成员变量,也是可以正常执行。

    下面这份代码执行时,就会奔溃了,因为this指针是空的,使用了 空的指针指向了成员变量i,程序就会奔溃。

    class A
    {
        int i;
    public:
        void Hello() { cout << i << "hello" << endl; }
        // ->> void Hello(A * this ) { cout << this->i << "hello" << endl; }
    };
    int main()
    {
        A * p = NULL;
        p->Hello(); //  ->> Hello(p); 
    }
    

    03 this指针和静态成员函数

    静态成员函数是不能使用 this 指针,因为静态成员函数相当于是共享的变量,不属于某个对象的变量。


    04 小结

    • 通过将C++程序翻译成C程序的方式,来理解 this 指针,其作用就是指向非静态成员函数所作用的对象,每个成员函数的第一个参数实际上都是有个默认 this 指针参数。

    • 静态成员函数是无法使用this指针,

    展开全文
  • C++ this指针详解

    千次阅读 2021-05-24 03:04:22
    C++ this指针详解this 是 C++ 中的一个关键字,也是一个 const 指针,它指向当前对象,通过它可以访问当前对象的所有成员。下面是小编为大家整理的C++ this指针详解,欢迎参考~C++ this指针详解所谓当前对象,是指...
  • C++中this指针的理解和作用

    千次阅读 2021-11-19 14:09:59
    想要理解C++语言中的this指针,下面我们做一个举例,我们要先把下面的C++代码转换成C代码: (1)大家知道,C语言中没有类定义class关键词,但是有跟class类似的定义关键词,就是struct结构体定义。 m_height...
  • C++中this指针作用以及用法详解

    万次阅读 多人点赞 2016-10-11 22:10:56
    为什么引用this指针? 当我们在类中定义了一个变量,同时又在类成员函数中定义了同一个变量时,也就是变量名重复时,但是我们要想使用类中的定义的变量,此时就...this指针作用域是在类内部,当在类的非静态成员函
  • C++ this指针

    万次阅读 多人点赞 2019-06-07 21:13:37
    类内的一切对于成员函数来说都是透明的),那么成员函数如何知道哪个对象的数据成员要被操作呢,原因在于每个对象都拥有一个指针:this指针,通过this指针来访问自己的地址。 注意: this指针并不是对象的一部分,...
  • C++ this指针详解(精辟)

    千次阅读 2022-02-02 19:12:10
    C++ this指针详解(精辟) this 是 C++ 中的一个关键字,也是一个 const 指针,它指向当前对象,通过它可以访问当前对象的所有成员。 所谓当前对象,是指正在使用的对象。例如对于stu.show();,stu 就是当前对象,...
  • 【C++】this指针原理

    2020-07-17 13:41:39
    this指针this指针概念this指针工作原理this指针的使用空指针访问成员函数常函数与常对象(const修饰的函数与对象) this指针概念 概念引出 c++的数据和操作也是分开存储,并且每一个非内联成员函数(non-inline ...
  • 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指针详解

    千次阅读 2020-04-17 15:58:05
    类内的一切对于成员函数来说都是透明的),那么成员函数如何知道哪个对象的数据成员要被操作呢,原因在于每个对象都拥有一个指针:this指针,通过this指针来访问自己的地址。注:this指针并不是对象的一部分,this...
  • C++中this指针的用法

    2018-11-04 00:13:49
    this指针只能在类的成员函数中调用,表示当前对象的地址; 这篇文档介绍了this指针的用法、概念; this指针相对简单,只需牢记概念即可。
  • this指针是类“成员函数”第一个隐藏的参数,该指针指向调用成员函数的对象(当前对象) 2. this指针的特性 (1) 只能在成员函数中使用 (2) this指针的类型:类类型* const (3) this指针没有存储在对象中,因此不会...
  • C++ - this指针用法

    千次阅读 2022-01-14 20:29:56
    this指针总结
  • 以下是对C++中this指针的用法进行了详细的分析介绍,需要的朋友可以过来参考下
  • 类的成员函数this指针

    2021-10-10 15:38:31
    this指针this指针this指针的特性this指针的使用 this指针 C++编译器给每个“非静态的成员函数“增加了一个隐藏的指针参数,让该指针指向当前对象(函数运行时调用该函数的对象),在函数体中所有成员变量的操作,都是...
  • C++经典问题_04 静态成员和this指针

    千次阅读 2022-03-24 15:46:28
    this指针 ① 为什么需要this指针this指针的用途 ③ this指针使用的时候注意事项 一. 静态成员 ① 静态成员变量 静态成员变量就是普通的成员变量前面加上static关键字就是静态成员变量. 所有的对象共享同一份...
  • C++中this指针使用

    千次阅读 2022-03-28 16:56:31
    this指针的使用: this 是 C++ 中的一个关键字,也是一个 const 指针,它指向当前对象,通过它可以访问当前对象的所有成员。 注意: 1.this 是 const 指针,它的值是不能被修改的,一切企图修改该指针的操作,如赋值...
  • C++this指针和函数调用

    千次阅读 2021-10-24 15:55:43
    C++this指针和函数调用 之前对this指针只是有所耳闻,但当真正使用时确是半知半解,今天有幸听了一位老师的详细讲解,总算是搞懂了了它,下面我将我的学习笔记分享给大家,希望对大家理解this指针有所帮助。 下面是...
  • QT中this指针

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

    千次阅读 多人点赞 2019-09-20 15:42:58
    1.this指针的用处: 一个对象的this指针并不是对象本身的一部分,不会影响sizeof(对象)的结果。this作用域是在类内部,当在类的非静态成员函数中访问类的非静态成员的时候,编译器会自动将对象本身的地址作为一个...
  • 作用域链、原型链、THIS指针是 JAVASCRIPT 入门级的三个重要概念。作为初学者经常容易混淆作用域链和原型链,导致使用 this 指针时诸多混乱,比方企图使用 this 指针引用一个私有变量;也可能导致在原型函数中使用类...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 611,769
精华内容 244,707
关键字:

this指针的作用