【C++第二阶段】空指针访问成员函数常成员函数常成员属性

news2024/9/21 12:24:03

你好你好!
以下内容仅为当前认识,可能有不足之处,欢迎讨论!


文章目录

  • 空指针访问成员函数
  • 常成员函数&常成员属性

空指针访问成员函数

类对象类型的空指针可以访问成员函数,但是不能够访问带有成员属性的成员函数。否则会报错,所以,通过这一说明,可以增加代码的健壮性。

C++中空指针也可以调用成员函数,但是也要注意有没有用到this指针

如果用到this指针,需要加以判断保证代码健壮性

代码:

#include<iosteam>
#include<string>
using namespace std;
class Person{
    public:
    int person_age;
    void show_class(){
        cout<<"这是一个person类"<<endl;
    }
    void show_age(){
        cout<<"Person类的age为"<<person_age<<endl;
        //这里的person_age相当于this.person_age.
    }
}
void test_0206_2(){
    Person *p = NULL;
    p->show_class();
    
    p->show_age();
    //会报错,因为空指针,无法访问person_age
}

运行结果:

image-20240206225317483

运行到这里后,就报错

image-20240206225301737

通过在show_age()方法中加判断语句,可以提高代码健壮性。

void show_age() {
	if (this == NULL) {
		return;
	}
	cout << "这是Person类中的age = " << person_age << endl;
}

常成员函数&常成员属性

What

加一个常,意为前面加一个const关键字,对于成员函数来说,则是方法最后加一个const,对于成员属性来说,则是在前面加一个const(但这与本次主题关系不大,不展开说,主要是常成员函数)。

成员函数后加const后称这个函数为常函数

常函数内不可以修改成员属性

成员属性声明时加关键字mutable后,在常函数中仍然可以修改

常对象:

声明对象前加const称该对象为常对象

常对象只能调用常函数

How

通过在成员函数函数名后加const,变为常函数,它可以访问常变量,但是不能赋值修改。

类对象也可以在前面加一个const关键词,意为常对象,即this指针此时变为了常量指针常量,首先指向的对象不能更改,其次指向的对象值不能修改。

Why

在之前的C++课程中,知道const对于指针来说,是不可修改的,初步为指针常量——指针的指向不可修改,以及常量指针,指向的变量值不可修改,也就变为了常量。若在指针常量前加一个const关键字,则为常量指针常量,指针指向不可修改同时,指针指向的值也不可修改。

对于成员函数来说,也一样。成员函数加上const关键词之后,变为常成员函数,不能修改类中变量的值,原理是,const实际修饰的是this指向,意为常量指针常量,因为this指针的本质是指针常量,不能修改指向,相当于原先的Person * const this加了const后变为const Person * const this,由指针常量变为了常指针常量,this指针指向的是对象所属的这个类,这个类里面常成员函数中内容都无法更改,所以,如果是以下的代码:

#include<iostream>
#include<string>
using namespace std;

class Person{
    public:
    int age;
    void change_age() const{
        this->age = 100;
    }
    
}

void test_0206_0(){
    Person *p ;
    p.change_age(); 
}

int main(){
    
    test_0206_0();
    system("pause");
    return 0;
}

在还没有编译前,报这样的错误:

image-20240206215150155

除非在age前面加一个multable关键词,可以改变age的值。

#include<iostream>
#include<string>
using namespace std;

class Person {
public :
	mutable int age;

	void change_age() const{
		this->age = 100;
		cout << "age = " << this->age << endl;
	}
};

void test_0206_0() {
	Person person;
	person.age = 20;
	cout << "p age = " << person.age << endl;
	person.change_age();
}

int main(){
    test_0206_0();
    
    system("pause");
    return 0;
}

运行结果:

image-20240206215735450

可以看到const修饰的成员函数变为常函数后,如果在成员属性前面加上mutable关键词,还是可以修改并在常函数内部访问的。

常对象

说完成员函数,如果对象前面也加个const关键词,里面的不加mutable修饰的成员属性可以被修改或访问吗?

代码:

#include<iostream>
#include<string>
using namespace std;

class Person{
    public:
    const int per_age;
    mutable int son_age;
    
    void change_age() const{
        cout<<"per age = "<<this->per_age <<"."<<endl;
        cout<<"son_age = "<<this->son_age <<"."<<endl;
        //per_age = 100;
        son_age = 100;
        
        cout<<"after change ..."<<endl;
        cout<<"per age = "<<this->per_age <<"."<<endl;
        cout<<"son age = "<<this->son_age <<"."<<endl;
    }
};

void test_0206_1(){
    const Person person;
    person.per_age = 10;
    person.son_age = 10;
    
    person.change_age();
}


int main(){
    test_0206_1();
    
    system("pause");
    return 0;
}

以下例子就是const关键词修饰类对象。

这时,类对象的成员属性都需要初始化,才能继续。

#include<iostream>
#include<string>
using namespace std;

class Person{
	public:
	int per_age = 10 ;
	mutable int son_age = 10;

	Person() {
		cout << "构造函数中" << endl;
		cout << "per age = " << this->per_age << "." << endl;
		cout << "son age = " << this->son_age << "." << endl;
	}

	void change_age() const {
		cout << "change age 函数中" << endl;
		cout << "per age = " << this->per_age << "." << endl;
		cout << "son_age = " << this->son_age << "." << endl;
		//per_age = 100;
		son_age = 100;

		cout << "after change ..." << endl;
		cout << "per age = " << this->per_age << "." << endl;
		cout << "son age = " << this->son_age << "." << endl;
	}
};

void test_0206_1() {
	Person person;
	person.per_age = 10;
	person.son_age = 20;

	person.change_age();
}

int main(){
    test_0206_1();
    
    system("pause");
    return 0;
}

运行结果:

image-20240206221240798

可以观察到per_age是使用const关键词修饰的,在最开始赋予初值10,之后不能修改,常函数不能修改,初始化时也不能修改。

而对于son_age来说,因为mutable关键词修饰,所以在哪里都能修改,无论是常对象还是常函数。但是也需要赋初值。

补充:

常对象只能调用常成员函数。

why

常对象不允许修改里面的值,对应的常成员函数也是同样的规定,而对于其他普通的成员函数可能会修改值,所以常对象只能调用常成员函数。


以上是我的学习笔记,希望对你有所帮助!
如有不当之处欢迎指出!谢谢!

学吧,学无止境,太深了

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

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

相关文章

Java基于微信小程序的医院核酸检测服务系统,附源码

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

arduino D1 中esp8266 没有ide的库

http://arduino.esp8266.com/stable/package_esp8266com_index.json https://arduino.esp8266.com/stable/package_esp8266com_index.json 这个是官网的包地址 拿到后复制到arduino ide中 然后在开发板管理器&#xff0c;搜索esp&#xff0c;搜出来后安装 去开发板选择 然后测…

俩种方法解决 VScode中 NPM 脚本消失,NPM 脚本未显示在资源管理器侧栏中

npm脚本是npm包管理器的一个功能&#xff0c;允许开发者在package.json文件中定义一系列命令脚本&#xff0c;用于执行各种开发任务。 今天打开准备运行的时候发现找不到NPM脚本了&#xff0c;左侧的一栏完全没有显示&#xff0c;在网上查阅了很多资料后总结出俩个方法可以用来…

前端基础复习(后端人员看前端知识)

企业级前端项目开发中&#xff0c;需要将前端开发所需要的工具、技术、流程、经验进行规范化和标准化&#xff0c;而不是零散的html、js、css文件堆叠在一起。 首先我们需配置前端的开发基础环境NodeJS&#xff0c;相当于后端人员java开发的JDK。然后搭建前端工程脚手架Vue-cl…

vue electron应用调exe程序

描述 用Python写了一个本地服务编译成exe程序&#xff0c;在electron程序启动后&#xff0c;自动执行exe程序 实现 1. 使用node的child_process模块可以执行windows执行&#xff0c;通过指令调exe程序 // electron/index.js var cp require("child_process"); /…

企业邮箱是什么?企业邮箱百科

本文将为大家讲解&#xff1a;1、企业邮箱的定义&#xff1b;2、企业邮箱的主要功能特点&#xff1b;3、企业邮箱如何选择和部署&#xff1b;4、企业邮箱的运营与维护&#xff1b;5、企业邮箱在实际工作中的应用与挑战&#xff1b;6、2024年最新五大企业邮箱盘点   下面提到的…

U盘显示空间小于实际U盘空间的解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

IP地址如何保护网络安全

面对网络攻击时&#xff0c;仅依靠常态化的网络安全防御系统已捉襟见肘&#xff0c;如联合使用IP地址数据可以形成多元化的安全解决方案&#xff0c;全面监控网络活动&#xff0c;发现潜在威胁&#xff0c;制定有针对性的应对措施。 网络攻击追踪 当网站或应用遭受DDoS等网络攻…

【JS逆向五】逆向模拟某网站的生成的【jsonKey】值 仅供学习

逆向日期&#xff1a;2024.02.07 使用工具&#xff1a;Node.js 加密方法&#xff1a;AES 文章全程已做去敏处理&#xff01;&#xff01;&#xff01; 【需要做的可联系我】 可使用AES进行解密处理&#xff08;直接解密即可&#xff09;&#xff1a;在线AES加解密工具 1、打开…

Spring Batch 批处理框架适配达梦数据库,实现从文件批量读取写入数据库(完整教程)

效果展示(达梦数据库): 技术简介: Spring Batch 是一个基于 Spring 的批处理框架,用于开发和执行大规模、高性能、可靠的批处理应用程序。它提供了丰富的功能和组件,用于处理复杂的批处理任务,例如大数据ETL(Extract-Transform-Load)、数据清洗、数据迁移、报表生成…

StringBuilder类常用方法(Java)

StringBuilder类常用方法 StringBuilder 是 Java 中常用的字符串缓冲区类&#xff0c;适用于频繁修改字符串的场景。 1. append(): 将指定字符串、字符、布尔值或其他数据类型的表示追加到字符串缓冲区的末尾。 StringBuilder sb new StringBuilder("Hello"); sb.…

9.0 Zookeeper 节点特性

本章节介绍一下 zookeeper 的节点特性和简单使用场景&#xff0c;正是由于这些节点特性的存在使 zookeeper 开发出不同的场景应用。 1、同一级节点 key 名称是唯一的 实例&#xff1a; $ ls / $ create /runoob 2 已存在 /runoob 节点&#xff0c;再次创建会提示已经存在。 …

SDWAN组网一般会需要哪些设备

随着企业网络需求的不断增长和变化&#xff0c; SD-WAN作为一种先进的网络架构技术&#xff0c;需要一系列设备来构建有效的组网。以下是SD-WAN组网所需的一些关键设备清单&#xff1a; &#xff08;1&#xff09;SD-WAN路youqi&#xff1a; SD-WAN路youqi是SD-WAN网络的核心设…

【Spring Boot】第一篇 创建简单的Spring Boot项目

导航 一. 简介二. 创建简单的Spring Boot项目1. 工具选择和版本确定2. 创建步骤 三. 部署项目四. 测试验证 一. 简介 Spring Boot是一个用于构建独立的、生产级别的Spring应用程序的框架。它简化了Spring应用程序的创建和配置过程&#xff0c;同时提供了很多开箱即用的功能&am…

Python轴承故障诊断入门教学

目录 往期精彩内容&#xff1a; 1 工作室实验平台介绍 2 轴承故障诊断教程—数据集 3 轴承故障诊断教程—算法模型 3.1 振动分析方法 3.2 频域特征提取 3.3 时域特征提取 3.4 模型基础的机器学习方法 3.5 深度学习方法 3.6 时频域融合方法 3.7 信号重构方法 3.8 基…

定制红酒:如何根据客户的口味偏好进行定制

在红酒定制服务中&#xff0c;了解并满足客户的口味偏好是至关重要的。云仓酒庄洒派深知这一点&#xff0c;并根据客户的口味偏好进行红酒的定制。以下是云仓酒庄洒派如何根据客户的口味偏好进行定制的详细步骤&#xff1a; 1. 深入了解客户的口味偏好 在定制服务开始之前&…

VS2017+Qt中文无法编译通过newline in constant解决办法

首先说我的解决办法 Tools->Extensions and Updates… 安装ForceUTF8(with BOM) 注意Force这个插件有好几个版本&#xff0c;一定要withBOM&#xff01;&#xff01;&#xff01;我之前安装的没有BOM导致改了各种设置还是一直编译不过&#xff0c;差点没气死我 另外代码里…

7.electron之渲染线程发送事件,主进程监听事件

如果可以实现记得点赞分享&#xff0c;谢谢老铁&#xff5e; Electron是一个使用 JavaScript、HTML 和 CSS 构建桌面应用程序的框架。 Electron 将 Chromium 和 Node.js 嵌入到了一个二进制文件中&#xff0c;因此它允许你仅需一个代码仓库&#xff0c;就可以撰写支持 Windows、…

深度学习图像分类相关概念简析+个人举例3(CNN相关补充,附详细举例代码1)

【1】激活函数&#xff08;Activation Function&#xff09;&#xff1a;在深度学习&#xff08;CNN&#xff09;中&#xff0c;激活函数用于引入非线性性质&#xff0c;帮助模型学习复杂的关系。常见的激活函数有ReLU、Sigmoid和Tanh等。 &#xff08;1&#xff09;ReLU激活函…

微服务-微服务Alibaba-Nacos 源码分析 (源码流程图)-2.0.1

客户端注册临时实例&#xff0c;GRPC处理 客户端服务发现 及订阅处理