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

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


文章目录

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

空指针访问成员函数

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

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.rhkb.cn/news/255224.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[C#] 如何使用ScottPlot.WPF在WPF桌面程序中绘制图表

什么是ScottPlot.WPF&#xff1f; ScottPlot.WPF 是一个开源的数据可视化库&#xff0c;用于在 WPF 应用程序中创建高品质的绘图和图表。它是基于 ScottPlot 库的 WPF 版本&#xff0c;提供了简单易用的 API&#xff0c;使开发人员能够通过简单的代码创建各种类型的图表&#…

二十、K8S-1-权限管理RBAC详解

目录 k8s RBAC 权限管理详解 一、简介 二、用户分类 1、普通用户 2、ServiceAccount 三、k8s角色&角色绑定 1、授权介绍&#xff1a; 1.1 定义角色&#xff1a; 1.2 绑定角色&#xff1a; 1.3主体&#xff08;subject&#xff09; 2、角色&#xff08;Role和Cluster…

算法学习——LeetCode力扣栈与队列篇2

算法学习——LeetCode力扣栈与队列篇2 150. 逆波兰表达式求值 150. 逆波兰表达式求值 - 力扣&#xff08;LeetCode&#xff09; 描述 给你一个字符串数组 tokens &#xff0c;表示一个根据 逆波兰表示法 表示的算术表达式。 请你计算该表达式。返回一个表示表达式值的整数。…

数据结构 - 线索树

一、 为什么要用到线索二叉树&#xff1f; 我们先来看看普通的二叉树有什么缺点。下面是一个普通二叉树&#xff08;链式存储方式&#xff09;&#xff1a; 乍一看&#xff0c;会不会有一种违和感&#xff1f;整个结构一共有 7 个结点&#xff0c;总共 14 个指针域&#xff0c…

IDEA中Git的使用小技巧-Toolbar(工具栏)的设置

目录 1 前言 2 步骤 2.1 打开设置 2.2 找到Menus and Toolbars 2.3 Menus and Toolbars界面的介绍 2.4 选择工具 2.5 查看 1 前言 工具栏的合理运用&#xff0c;能够极大程度上为我们省时省力 &#xff0c;接下来我将以Git工具的添加&#xff0c;介绍如何定制我们IDEA…

HarmonyOS 鸿蒙应用开发(十、第三方开源js库移植适配指南)

在前端和nodejs的世界里&#xff0c;有很多开源的js库&#xff0c;通过npm(NodeJS包管理和分发工具)可以安装使用众多的开源软件包。但是由于OpenHarmony开发框架中的API不完全兼容V8运行时的Build-In API&#xff0c;因此三方js库大都需要适配下才能用。 移植前准备 建议在适…

【开源】JAVA+Vue.js实现计算机机房作业管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 登录注册模块2.2 课程管理模块2.3 课时管理模块2.4 学生作业模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 课程表3.2.2 课时表3.2.3 学生作业表 四、系统展示五、核心代码5.1 查询课程数据5.2 新增课时5.3 提交作…

React18原理: Fiber架构下的单线程CPU调度策略

概述 React 的 Fiber 架构, 它的整个设计思想就是去参考CPU的调度策略CPU现在都是多核多进程的&#xff0c;重点研究的是 CPU是单核单线程&#xff0c;它是如何调度的?为什么要去研究单线程的CPU&#xff1f; 浏览器中的JS它是单线程的JS 的执行线程和浏览器的渲染GUI 是互斥…

倒计时61天

M-智乃的36倍数(normal version)_2024牛客寒假算法基础集训营3 (nowcoder.com) //非ac代码,超时了,54.17/100#include<bits/stdc.h> using namespace std; const int N1e55; const int inf0x3f3f3f3f; #define int long long int n; string s1[N]; void solve() {cin>…

STM32的ADC电压采集

时间记录&#xff1a;2024/2/9 一、ADC相关知识点 &#xff08;1&#xff09;STM32的ADC时钟不要超过14MHz&#xff0c;不然结果的准确率将下降 &#xff08;2&#xff09;ADC分为规则组和注入组&#xff0c;规则组相当于正常运行的程序&#xff0c;注入组相当于中断可以打断…

随机MM引流源码PHP开源版

引流源码最新随机MM开源版PHP源码&#xff0c;非常简洁好看的单页全解代码没任何加密 直接上传即可用无需数据库支持主机空间

RabbitMQ-4.MQ的可靠性

MQ的可靠性 4.MQ的可靠性4.1.数据持久化4.1.1.交换机持久化4.1.2.队列持久化4.1.3.消息持久化 4.2.LazyQueue4.2.1.控制台配置Lazy模式4.2.2.代码配置Lazy模式4.2.3.更新已有队列为lazy模式 4.MQ的可靠性 消息到达MQ以后&#xff0c;如果MQ不能及时保存&#xff0c;也会导致消…

如何使用websocket

如何使用websocket 之前看到过一个面试题&#xff1a;吃饭点餐的小程序里&#xff0c;同一桌的用户点餐菜单如何做到的实时同步&#xff1f; 答案就是&#xff1a;使用websocket使数据变动时服务端实时推送消息给其他用户。 最近在我们自己的项目中我也遇到了类似问题&#xf…

全功能的屏幕截图工具 - PicPick

全功能的屏幕截图工具 - PicPick 1. PicPick1.1. PicPick 中文1.2. Hot keys References 1. PicPick https://picpick.app/zh/ https://picpick.app/en/ A full-featured screen capture and recording tool, Intuitive image editor, color picker, color palette, pixel-ru…

re:从0开始的CSS学习之路 9. 盒子水平布局

0. 写在前面 过年也不能停止学习&#xff0c;一停下就难以为继&#xff0c;实属不应 1. 盒子的水平宽度 当一个盒子出现在另一个盒子的内容区时&#xff0c;该盒子的水平宽度“必须”等于父元素内容区的宽度 盒子水平宽度&#xff1a; margin-left border-left padding-lef…

使用Qt创建项目 Qt中输出内容到控制台 设置窗口大小和窗口标题 Qt查看说明文档

按windows键&#xff0c;找到Qt Creator &#xff0c;打开 一.创建带模板的项目 新建项目 设置项目路径QMainWindow是带工具栏的窗口。 QWidget是无工具栏的窗口。 QDuakig是对话框窗口。创建好的项目如下&#xff1a; #include "widget.h"// 构造函数&#xff…

Go内存优化与垃圾收集

Go提供了自动化的内存管理机制&#xff0c;但在某些情况下需要更精细的微调从而避免发生OOM错误。本文介绍了如何通过微调GOGC和GOMEMLIMIT在性能和内存效率之间取得平衡&#xff0c;并尽量避免OOM的产生。原文: Memory Optimization and Garbage Collector Management in Go 本…

回归预测 | Matlab实现POA-CNN-LSTM-Attention鹈鹕算法优化卷积长短期记忆网络注意力多变量回归预测(SE注意力机制)

回归预测 | Matlab实现POA-CNN-LSTM-Attention鹈鹕算法优化卷积长短期记忆网络注意力多变量回归预测&#xff08;SE注意力机制&#xff09; 目录 回归预测 | Matlab实现POA-CNN-LSTM-Attention鹈鹕算法优化卷积长短期记忆网络注意力多变量回归预测&#xff08;SE注意力机制&…

在windows的控制台实现贪吃蛇小游戏

欢迎来到博主的文章 博主id&#xff1a;代码小豪 前言&#xff1a;看懂这篇文章需要具有C语言基础&#xff0c;还要对单链表具有一定的理解。如果你只是想要试玩这个游戏&#xff0c;可以直接在文章末尾找到源码 由于实现贪吃蛇需要调用Win32 API函数&#xff0c;这些函数我会…

JVM 性能调优 - Java 虚拟机内存体系(1)

Java 虚拟机我们简称为 JVM&#xff08;Java Virtual Machine&#xff09;。 Java 虚拟机在执行 Java 程序的过程中&#xff0c;会管理几个不同的数据区域。如下图所示&#xff1a; 下面我会介绍这几个数据区的特点。 堆 堆区的几个特点&#xff1a; 线程共享。启动时创建堆…