c++ this指针与空指针调用类方法以及常函数

news2024/12/29 10:40:16

一、this指针

说明

1、c++的成员变量与成员内函数是分开存储
2、每一个非静态成员函数只会诞生一份函数实例,多个同类型的队形公用的是同一份成员函数的代码
3、this指向调用这一份成员函数代码的对象实例
4、this是一个隐藏的指向对象实例的一个指针,无需定义直接使用即可

作用

1、可以区别形参与成员变量(当成员函数的形参与类成员变量同名时)
2、在类的非静态成员函数中返回对象本身,return *this 

例子一

#include <iostream>
#include <string.h>

using namespace std;

//this指针
//1、c++的成员变量与成员内函数是分开存储
//2、每一个非静态成员函数只会诞生一份函数实例,多个同类型的队形公用的是同一份成员函数的代码
//3、this指向调用这一份成员函数代码的对象实例
//4、this是一个隐藏的指向对象实例的一个指针,无需定义直接使用即可

//作用
//1、可以区别形参与成员变量(当成员函数的形参与类成员变量同名时)
//2、在类的非静态成员函数中返回对象本身,return *this 
class Persion
{
public:
	void func01(int age)
	{
		//age = age;//此时复制符号的做优都是同一个变量
		this->age = age;
		this->m_Age = age;

	}
	/*Persion funcAddMAge(Persion &p)
	{
		this->m_Age += p.m_Age;
		return *this;
	}*/
	Persion funcAddMAge(Persion& p)
	{
		this->m_Age += p.m_Age;
		return *this;
	}
	int age = age;
	int m_Age;//m_ 为member
	string m_Name;
};

void main()
{
	Persion p;
	p.func01(10);
	cout << "func01:" << p.age << endl;//func01:10
	Persion p2;
	p2.func01(10);
	cout << "func02:" << p2.m_Age << endl;//func02:10
	p2.funcAddMAge(p).funcAddMAge(p).funcAddMAge(p);
	//Persion funcAddMAge(Persion &p)如果返回值为对象本身,则每次返回的都是一个新的对象
	//cout << "func02:" << p2.m_Age << endl;//func02:20
	cout << "func02:" << p2.m_Age << endl;//func02:20

}

例子二

#include <iostream>
#include <string.h>

using namespace std;

//this指针
//1、c++的成员变量与成员内函数是分开存储
//2、每一个非静态成员函数只会诞生一份函数实例,多个同类型的队形公用的是同一份成员函数的代码
//3、this指向调用这一份成员函数代码的对象实例
//4、this是一个隐藏的指向对象实例的一个指针,无需定义直接使用即可

//作用
//1、可以区别形参与成员变量(当成员函数的形参与类成员变量同名时)
//2、在类的非静态成员函数中返回对象本身,return *this 
class Persion
{
public:
	void func01(int age)
	{
		//age = age;//此时复制符号的做优都是同一个变量
		this->age = age;
		this->m_Age = age;

	}
	/*Persion funcAddMAge(Persion &p)
	{
		this->m_Age += p.m_Age;
		return *this;
	}*/
	Persion& funcAddMAge(Persion& p)//返回的是对象本身
	{
		this->m_Age += p.m_Age;
		return *this;
	}
	int age = age;
	int m_Age;//m_ 为member
	string m_Name;
};

void main()
{
	Persion p;
	p.func01(10);
	cout << "func01:" << p.age << endl;//func01:10
	Persion p2;
	p2.func01(10);
	cout << "func02:" << p2.m_Age << endl;//func02:10
	p2.funcAddMAge(p).funcAddMAge(p).funcAddMAge(p);
	//Persion funcAddMAge(Persion &p)如果返回值为对象本身,则每次返回的都是一个新的对象
	//cout << "func02:" << p2.m_Age << endl;//func02:20
	cout << "func02:" << p2.m_Age << endl;//func02:40

}

 二、空指针调用类方法

#include <iostream>
#include <string.h>
using namespace std;
class Persion
{
public:

	void showClassName()
	{
		cout << "class name is Persion" << endl;
	}
	void showClassAge()
	{
		/*if (this == NULL) {//可以避免传入空指针
		
			return;
		}*/
		//这里隐藏了额this 此处相当于this->m_Age
		cout << m_Age << endl;
	
	}
	int m_Age = 10;
};

void main()
{
	Persion * p = NULL;
	p->showClassName();
	p->showClassAge();//不能的出正确预期

	

}

三、const常函数

说明    

this指针的本质,是常量指针 Persion * const this,指针的变量this的内容,即指向不可改变
但是只想的内容是可以已修改的,所以可以使用this->m_Age = 100;
如果成员函数后面添加const  则变量const Persion * const this,指针直系那个以及内容都不可修改
只影响添加了const关键字的常函数

例外

特殊变量,即使在常函数中,也可以修改,需要添加关键字mutable

#include <iostream>
#include <string.h>
using namespace std;
class Persion
{
public:
	//this指针的本质,是常量指针 Persion * const this,指针的变量this的内容,即指向不可改变
	//但是只想的内容是可以已修改的,所以可以使用this->m_Age = 100;
	//如果成员函数后面添加const  则变量const Persion * const this,指针直系那个以及内容都不可修改
	//只影响添加了const关键字的常函数
	void showPersion() const
	{
		//this->m_Age = 100;
		//this = NULL;
		this->m_Name = "WQ";

	}
	void showPersion02()
	{
		this->m_Age = 100;
	}

	int m_Age;
	mutable string m_Name;//特殊变量,即使在常函数中,也可以修改,需要添加关键字mutable

};
void main()
{
	Persion p;
	p.showPersion();



}

常对象例子

常对象只能调用常函数,不能调用普通函数,因为普通函数可能修改 

#include <iostream>
#include <string.h>
using namespace std;
class Persion
{
public:
	//this指针的本质,是常量指针 Persion * const this,指针的变量this的内容,即指向不可改变
	//但是只想的内容是可以已修改的,所以可以使用this->m_Age = 100;
	//如果成员函数后面添加const  则变量const Persion * const this,指针直系那个以及内容都不可修改
	//只影响添加了const关键字的常函数
	void showPersion() const
	{
		//this->m_Age = 100;
		//this = NULL;
		this->m_Name = "WQ";

	}
	void showPersion02()
	{
		this->m_Age = 100;
	}

	int m_Age;
	mutable string m_Name;//特殊变量,即使在常函数中,也可以修改,需要添加关键字mutable

};
void main()
{
	Persion p;
	p.showPersion();
	
	const Persion p2;//常对象
	p2.showPersion();//可以调用普通函数
	p2.m_Age = 100;//err
	p2.m_Name = "wq";//正常
	p2.showPersion02();//err 常对象只能调用常函数,不能调用普通函数,因为普通函数可能修改




}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1031032.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用Vue-cli构建spa项目及结构解析

一&#xff0c;Vue-cli是什么&#xff1f; 是一个官方发布的Vue脚手架工具&#xff0c;用于快速搭建Vue项目结构&#xff0c;提供了现代前端开发所需要的一些基础功能&#xff0c;例如&#xff1a;Webpack打包、ESLint语法检查、单元测试、自动化部署等等。同时&#xff0c;Vu…

百度SEO不稳定的原因及解决方法(百度SEO不稳定因素的5大包括)

百度SEO优化不稳定介绍&#xff1a;蘑菇号-www.mooogu.cn 随着百度SEO算法的不断变化和升级&#xff0c;许多网站的SEO排名经常出现不稳定的情况&#xff0c;这种情况在一定程度上影响了网站的流量和排名&#xff0c;导致网站的质量评分降低。因此&#xff0c;深入分析百度SEO…

ubuntu的root用户修改密码失败

解决如下&#xff1a; 查看文件属性是否有a或i lsattr /etc/group /etc/passwd /etc/shadow 移除a和i的属性权限 chattr -ai /etc/group /etc/passwd /etc/shadow 再次使用passwd进行修改密码&#xff0c;就成功了

时序预测 | MATLAB实现NGO-LSTM北方苍鹰算法优化长短期记忆网络时间序列预测

时序预测 | MATLAB实现NGO-LSTM北方苍鹰算法优化长短期记忆网络时间序列预测 目录 时序预测 | MATLAB实现NGO-LSTM北方苍鹰算法优化长短期记忆网络时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 MATLAB实现NGO-LSTM北方苍鹰算法优化长短期记忆网络时间序列预…

排序算法-----计数排序

目录 前言&#xff1a; 计数排序 1.算法描述 2. 基本思想 3.实现逻辑 4.示例剖析 5.动图演示 代码实现 1.C/C代码 2.Python代码 算法分析 时间复杂度 空间复杂度 稳定性 局限性 前言&#xff1a; 有没有一种排序时间复杂度为直线正比的排序算法呢&#xff1f;有…

贸易战的影响:跨境电商的“黑洞”风险与机遇

当今全球贸易局势充满了不确定性和动荡。贸易战的阴云笼罩下&#xff0c;跨境电商企业面临着前所未有的挑战&#xff0c;但与此同时&#xff0c;也蕴藏着巨大的机遇。本文将深入探讨贸易战对跨境电商的影响&#xff0c;以及企业在这个新现实中如何应对风险并寻找机遇。 贸易战的…

以京东平台为例写一份电商平台API接口文档

公共参数 请求地址: 申请调用KEY地址 名称类型必须描述keyString是调用key&#xff08;必须以GET方式拼接在URL中&#xff09;secretString是调用密钥api_nameString是API接口名称&#xff08;包括在请求地址中&#xff09;[item_search,item_get,item_search_shop等]cacheSt…

Microsoft edge 设置百度首页

1. 新建页下载插件&#xff1a;New Tab Redirect 怎样将浏览器启动页和新标签页设置为特定的网页-百度经验 (baidu.com) 2. 首页设置百度页&#xff1a; 打开联想电脑管家

Talk | ICCV’23 清华赵天辰:Ada3D-基于动态推理的3D感知模型压缩及软硬件协同优化

​本期为TechBeat人工智能社区第533期线上Talk&#xff01; 北京时间9月21日(周四)20:00&#xff0c;清华大学博士生—赵天辰的Talk已准时在TechBeat人工智能社区开播&#xff01; 他与大家分享的主题是: “Ada3D-基于动态推理的3D感知模型压缩及软硬件协同优化”&#xff0c;他…

Go面试题:锁的实现原理sync-mutex篇

在Go中&#xff0c;主要实现了两种锁&#xff1a;sync.Mutex(互斥锁) 以及 sync.RWMutex(读写锁)。 本篇主要给大家介绍sync.Mutex的使用和实现原理。 文章目录 为什么需要锁在Go中对于并发程序进行公共资源的访问的限制最常用的就是互斥锁&#xff08;sync.mutex&#xff09…

理清SpringBoot CURD处理逻辑、顺序

&#x1f497;wei_shuo的个人主页 &#x1f4ab;wei_shuo的学习社区 &#x1f310;Hello World &#xff01; 理清SpringBoot CURD处理逻辑、顺序 Controller&#xff08;控制器&#xff09;&#xff1a; 控制器接收来自客户端的请求&#xff0c;并负责处理请求的路由和参数解析…

汽车电子AEC Q101车规认证FDD9507L-F085 P沟道MOS管

深力科带你了解关于汽车电子AEC Q101车规认证&#xff1f; 是一种针对分立半导体的可靠性测试认证程序&#xff0c;由汽车电子协会发布。这个认证程序主要是为了确保汽车电子产品在各种严苛的条件下能够正常工作和可靠运行。它包括了对分立半导体的可靠性、环境适应性、温度循…

配置文件和系统变量

文章目录 系统变量和配置文件1. 系统变量2. 配置文件的使用2.1 配置文件格式2.2 启动命令与选项组2.3 特定的MYSQL版本的专用选项组2.4 同一个配置文件中多个组的优先级2.5 命令行和配置文件中启动选项的区别 系统变量和配置文件 1. 系统变量 除了在用SET临时方式设置&#x…

【Vue】安装并使用vue-cli搭建SPA项目

目录 一、Vue-cli安装 1.1 什么是Vue-cli 1.2 安装Vue-cli 1.3 使用Vue-cli构建项目 二、SPA项目 2.1 导入、运行SPA项目 2.2 vue项目结构说明 2.3 .什么是*.vue文件 2.4 基于SPA项目完成路由 2.5 基于SPA项目完成嵌套路由 一、Vue-cli安装 1.1 什么是Vue-cli Vue CL…

ubuntu 配置NTP时间服务器

sudo apt update 显示秒&#xff08;进入Top Bar 打开second&#xff09; sudo apt install gnome-tweaks 安装ntp服务器 sudo apt install ntp 在服务端修改ntp配置开放客户端所在的网段 sudo gedit /etc/ntp.conf restrict 172.19.7.0 mask 255.255.255.0 nomodify notrap 重…

java - 散列算法 SHA-256 hash值计算

文章目录 前言java - 散列算法 SHA-256 hash值计算1. 散列算法是什么?2. 散列算法的主要特征是什么?3. 计算SHA-256值有没有可能重复4. SHA-256算法实现示例 前言 如果您觉得有用的话&#xff0c;记得给博主点个赞&#xff0c;评论&#xff0c;收藏一键三连啊&#xff0c;写作…

Python实现MYSQL蜜罐

1 LOAD DATA INFILE介绍 首先开启一个Mysql&#xff0c;看一下mysql是如何读取主机文件的。 1.1 linux搭建mysql 1&#xff09;docker运行mysql 2&#xff09;启动Mysql docker run -itd…

【docker安装Mysql并配置主从复制】

Mysql主从复制 目的&#xff1a; 是为了后面naocs集群的服务配置做准备工作 准备工作 准备至少两台虚拟机或服务器&#xff0c;安装好了docker&#xff0c;找到他们的ip地址 后面操作都用xshell操作来代替 拉取并启动mysql镜像和容器 主机的命令为mysql01&#xff0c;对…

综述 | 实时三维形状测量技术的综述

原创 | 文 BFT机器人 随着人工智能和机器人技术的快速发展&#xff0c;实时三维形状测量技术变得愈发重要。由于机器人通常在动态环境中操作&#xff0c;因此机器人装备的三维形状测量技术需要能够实时从运动的物体中获取三维形状信息。未来的三维机器视觉技术实际上依赖于实时…

个人博客搭建记录

个人博客地址&#xff1a;www.jiasun.top 使用github pagehexo搭建&#xff0c;主题为fluid&#xff0c;搭建步骤参照&#xff1a;Github hexo 实现自己的个人博客、配置主题&#xff08;超详细&#xff09; 主题&#xff1a;https://hexo.fluid-dev.com/ 搭建时的问题&…