首页 > 编程语言 >C++ this指针的概念和使用

C++ this指针的概念和使用

时间:2024-04-06 15:32:35浏览次数:21  
标签:p2 10 p1 Person age C++ 概念 指针

this指针的概念:

在C++中成员变量和成员函数是分开存储的。

每一个非静态成员函数只会诞生一份函数实例,也就是说多个同类型的对象会共用一块代码

那么问题是:这一块代码是如何区分哪个对象调用自己的呢?

c++通过提供特殊的对象指针,this指针,解决上述问题。

关键:this指针 指向 被调用的成员函数所属的 对象! 谁调用了成员函数,this就指向谁

this指针是隐含在每一个 非静态成员函数 内的一种指针(内置的,我一直都在你身体里哦~)。

this指针不需要定义,直接使用即可。

this指针的用途:

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

问题描述

this指针主要用于解决两个问题:
1、解决名称冲突
2、返回对象本身用*this
现在我们创建一个类:

class Person
{
public:

	Person(int age)
	{
		//1、当形参和成员变量同名时,可用this指针来区分
        // age = age; // 这样cout输出的是30190,都是age,相当于有参构造函数没有给成员变量赋值
		this->age = age; //点击右值的age会发现它和形参有阴影,点击左值的age会发现它和成员变量以及调用处的age有阴影
        //this指针指向 被调用的成员函数 所属的 对象
	}
    void PersonAddAge(Person &p){
        this->age += p.age;
    }

	Person& PersonAddPerson(Person p)
	{
		this->age += p.age;
		//this指向p2的指针,而*this指向的就是 p2本身
		return *this; //得用Person&
	}

    Person PersonAddPerson2(Person p)
	{
		this->age += p.age;
		//this指向p2的指针,而*this指向的就是 p2本身
		return *this; //不加&
	}

	int age;
};

这个类里面有构造函数Person、非静态成员函数PersonAddAgePersonAddPersonPersonAddPerson2以及非静态成员变量int age

详细解释:

1、解决名称冲突:

void test01()
{
	Person p1(10);
	cout << "p1.age = " << p1.age << endl;
}

main函数调用test01时,如果采用age=age的方式在构造函数中赋值,会出现输出一个随机数的错误,比如输出30190,而非10。主要原因还是在于形参和成员变量同名,相当于没有赋值操作。把构造函数里的东西都注释了会发现也是输出一个随机的数字。因此需要用this指针的方式解决名称冲突。

2、返回对象本身用*this:

第一种情况:不加return返回值

void test02()
{
	Person p1(10);
	cout << "p1.age = " << p1.age << endl;

	Person p2(10);
    p2.PersonAddAge(p1); //成员函数PersonAddAge属于p2,所以里面的this指针指向p2,计算结果就是p2的age加上p1的age
	cout << "p2.age = " << p2.age << endl;

    //error: invalid use of ‘void’,所以p2.PersonAddAge(p1)必须返回p2这个对象它才能继续 .
    // p2.PersonAddAge(p1).PersonAddAge(p1).PersonAddAge(p1);
    // cout << "p2.age = " << p2.age << endl;
}

可以对p2本身修改,输出:
p1.age = 10
p2.age = 20
但是如果p2.PersonAddAge(p1).PersonAddAge(p1).PersonAddAge(p1);这样累加就会报错:

error: invalid use of ‘void’

所以p2.PersonAddAge(p1)必须返回p2这个对象它才能继续 .

第二种情况:加return返回值,返回Person & (引用返回)

void test02()
{
	Person p1(10);
	cout << "p1.age = " << p1.age << endl;

	Person p2(10);
    p2.PersonAddPerson(p1).PersonAddPerson(p1).PersonAddPerson(p1);
    cout << "p2.age = " << p2.age << endl;
    
}

调用PersonAddPerson进行累加,输出:
p1.age = 10
p2.age = 40 (加了三次10,都是对p2这个对象进行操作的)
那么为什么Person要加&呢?
因为引用指向本身的内存,不加引用相当于拷贝了(拷贝构造函数),而拷贝指向另一个内存。
请看下面的例子:

第三种情况:加return返回值,返回Person (值返回)

void test02()
{
	Person p1(10);
	cout << "p1.age = " << p1.age << endl;

	Person p2(10);
    Person p3 = p2.PersonAddPerson2(p1).PersonAddPerson2(p1).PersonAddPerson2(p1);
    cout << "p2.age = " << p2.age << endl;
    cout << "p3.age = " << p3.age << endl;
}

调用PersonAddPerson2进行累加,输出:
p1.age = 10
p2.age = 20
p3.age = 40
分析:执行p2.PersonAddPerson2(p1)会返回一个新的对象 p‘ ,它的age值是20,p2的age值由于this指针所以也是20,然后继续执行.PersonAddPerson2(p1),就会又创建一个新的对象 p’’ ,它的age值是30,而p2的age值依然是20,因为后面的操作和p2没关系了,依次类推把最后的结果赋值给p3,p3age值为40。

因此要注意区分 引用返回 和 值返回 的区别

值得注意的是,请不要把 值传递方式返回值方式返回局部对象 混淆了。
值方式返回局部对象这个链接里有关于它的描述,使用linux系统时会有一个RVO机制,它会少一次拷贝构造和析构的开销(编译器帮助我们作了优化)。

标签:p2,10,p1,Person,age,C++,概念,指针
From: https://blog.csdn.net/weixin_43349440/article/details/137428169

相关文章

  • C++中拷贝构造函数调用时机——学习记录
    拷贝构造函数调用时机:C++中拷贝构造函数调用时机通常有三种情况使用一个已经创建完毕的对象来初始化一个新对象值传递的方式给函数参数传值以值方式返回局部对象问题描述在黑马C++课程上学习时发现,第三种情况:以值方式返回局部对象时会不会调用构造函数。对比后发现,黑......
  • 【机器学习】线性回归的基本概念
    机器学习多元线性回归文章目录机器学习多元线性回归前言一、基本概念1.连续值2.离散值3.简单线性回归4.最优解5.多元线性回归二、正规方程1.最小二乘法矩阵表示2.多元一次方程举例前言本文作为自己学习人工智能的开端,学习并掌握及机器学习的相关内容,逐渐......
  • socket编程——C++实现基于UDP协议的简单通信(含详解)
    文章后面有代码,可以直接复制在VisualStudio2022中运行(注意:必须是两个项目,客户端服务端各一个,连接在同一网络中,先运行服务端,并且客户端数据发送的目标IP要改为你服务端的IP)目录前言帮助文档一、UDP通信框架1.服务端2.客户端二、服务端实现1.加载库(WSAStartup函数)......
  • [C++] 小游戏 斗破苍穹2.8.1版本 zty出品
    前言大家好,今天zty带来的是首次增加调试角色的版本,2.8.1版本主要更新了调试角色(感觉没啥用)。先赞后看 养成习惯点赞过100一天更3次正文#include<stdio.h>#include<iostream>#include<ctime>#include<bits/stdc++.h>#include<time.h>//suiji#include<windows.h>/......
  • 【C++】二叉搜索数
    目录一、二叉搜索树的概念二、二叉搜索树的模拟实现1、定义节点2、构造二叉树3、析构二叉树​4、拷贝二叉树5、二叉树赋值6、插入节点......
  • 深入理解指针(3)
    目录:1.指针数组2.指针数组模拟二维数组3.字符指针变量4.数组指针变量1.指针数组首先我们需要明确指针数组究竟是指针还是数组?指针数组是存放指针的数组,我们可以类比整型数组和字符数组如图所示指针数组的每个元素都是地址,又可以指向一块区域。2.指针数组模拟二......
  • C++之路
    C++与C语言的区别: C语言是面向过程的,面向函数的封装和函数的顺序调用的过程;c++面向对象开发即面向类开发——一个结构体就是一个对象,包含行为(函数),和属性(变量);  C++能够对函数进行重载,可以使用同名的函数,功能变得更强大,c++引入了名字空间,可以是定义的变量名更多(提升变量......
  • 【c++】初阶模版与STL简单介绍
    ......
  • 【C语言初阶】指针运算
    【C语言初阶】指针运算文章目录【C语言初阶】指针运算四、指针运算1介绍2指针+-整数2.1示例3指针-指针3.1示例3.2模拟实现`strlen()`3.2.1方法一:指针-指针3.2.2方法二:计数器3.2.3方法三:函数递归4指针的关系运算4.1示例14.2示例24.3标准规定总......
  • 【C语言初阶】指针
    【C语言初阶】指针文章目录【C语言初阶】指针一、指针是什么?1指针是什么?2内存2指针变量2.1示例2.2总结3如何编址?3.1编址3.1总结二、指针和指针类型1指针的类型1.1示例2指针+-整数2.1示例2.2总结3指针的解引用3.1示例3.2总结总结:本章目标:......