【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.hqwc.cn/news/467889.html

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

相关文章

算法刷题:复写零

复写零 .习题链接题目描述算法原理初始值步骤1步骤2我的答案: . 习题链接 复写零 题目描述 给你一个长度固定的整数数组 arr &#xff0c;请你将该数组中出现的每个零都复写一遍&#xff0c;并将其余的元素向右平移。 注意&#xff1a;请不要在超过该数组长度的位置写入元素…

【C++】内存详解(堆,栈,静态区)

&#x1f490; &#x1f338; &#x1f337; &#x1f340; &#x1f339; &#x1f33b; &#x1f33a; &#x1f341; &#x1f343; &#x1f342; &#x1f33f; &#x1f344;&#x1f35d; &#x1f35b; &#x1f364; &#x1f4c3;个人主页 &#xff1a;阿然成长日记 …

【DDD】学习笔记-事件风暴与领域分析建模

在确定了全景事件流之后&#xff0c;可以在战略设计层面继续精进&#xff0c;鉴别出领域与限界上下文的边界&#xff0c;进入战术设计阶段的领域分析建模。 事件风暴的分析模型要素 通过事件风暴进行领域分析建模&#xff0c;其核心的模型要素就是“事件”。除此之外&#xf…

CUDA编程 - 共享内存 - shared memory - 学习记录

CUDA编程 - 共享内存 共享内存一、为什么要使用 shared memory&#xff1f;1.1、从硬件出发理解&#xff1a;1.2、从软件出发理解&#xff1a; 二、如何使用shared memory2.1、静态共享内存2.2、动态共享内存 三、实践 - 使用共享内存执行矩阵乘法总结 共享内存 一、为什么要使…

基于 Python 深度学习的电影评论情感分析系统,附源码

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

13. 【Linux教程】移动文件和目录

移动文件和目录 前面小节介绍了如何创建文件和目录、删除文件和目录&#xff0c;本小节介绍如何使用 mv 命令移动文件和目录。 1. 移动文件或目录至另外一个目录下 可以使用 mv file_name 路径 这种格式&#xff0c;移动文件至其他目录下&#xff0c;后面跟的路径可以是相对路…

政安晨:【详细解析】【用TensorFlow从头实现】一个机器学习的神经网络小示例【解构演绎】

准备工作 咱们将通过这篇文章反复咀嚼我原来文章里提到的那篇《神经网络小实例》&#xff0c;大家可以先看看&#xff0c;比如做些环境准备等等&#xff08;这是我的这篇文章的链接&#xff09;&#xff1a; 政安晨的机器学习笔记——基于Anaconda安装TensorFlow并尝试一个神…

图像处理之《神经网络模型的通用隐写框架》论文阅读

一、文章摘要 在本文中&#xff0c;我们提出了一个通用的隐写框架&#xff0c;用于神经网络实现隐蔽通信。首先&#xff0c;我们设计了一种基线隐写方法&#xff0c;在网络训练过程中将秘密数据嵌入到给定神经网络(封面网络)的卷积层中。对于包含秘密数据的网络(隐写网络)&…

python 基础知识点(蓝桥杯python科目个人复习计划40)

今日复习内容&#xff1a;矩阵乘法&#xff0c;高斯消元 哈哈&#xff0c;我来干回老本行&#xff0c;复习点儿数学类专业学的东西 因为电脑上制作费时间&#xff0c;所以我直接用我的《高等代数》和《数值分析》笔记。 一.矩阵乘法 例题1&#xff1a;矩阵相乘 题目描述&am…

ElasticSearch级查询Query DSL上

目录 ES高级查询Query DSL match_all 返回源数据_source 返回指定条数size 分页查询from&size 指定字段排序sort 术语级别查询 Term query术语查询 Terms Query多术语查询 exists query ids query range query范围查询 prefix query前缀查询 wildcard query通…

蓝桥杯嵌入式第10届真题(完成) STM32G431

蓝桥杯嵌入式第10届真题(完成) STM32G431 题目 main.c /* USER CODE BEGIN Header */ /********************************************************************************* file : main.c* brief : Main program body********************************…

家政小程序系统源码开发:引领智能生活新篇章

随着科技的飞速发展&#xff0c;小程序作为一种便捷的应用形态&#xff0c;已经深入到我们生活的方方面面。尤其在家庭服务领域&#xff0c;家政小程序的出现为人们带来了前所未有的便利。它不仅简化了家政服务的流程&#xff0c;提升了服务质量&#xff0c;还为家政服务行业注…