【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.mfbz.cn/a/377316.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

js-添加网页快捷方式

title: js-添加网页快捷方式 categories: Javascript tags: [p快捷方式] date: 2024-02-04 15:28:25 comments: false mathjax: true toc: true js-添加网页快捷方式 前篇 谷歌上包困难的情况, 只能通过投放落地页来缓解一下痛苦, web2app 那种形式有几个比较大的缺点就是需要…

人工智能基础部分24-人工智能的数学基础,汇集了人工智能数学知识最全面的概况

、 大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下人工智能基础部分24-人工智能的数学基础&#xff0c;汇集了人工智能数学知识最全面的概况&#xff0c;深度学习是一种利用多层神经网络对数据进行特征学习和表示学习的机器学习方法。要全面了解深度学习的数学基…

FlinkSql通用调优策略

历史文章迁移&#xff0c;稍后整理 使用DataGenerator 提前进行压测&#xff0c;了解数据的处理瓶颈、性能测试和消费能力 开启minibatch&#xff1a;"table.exec.mini-batch.enabled", "true" 开启LocalGlobal 两阶段聚合&#xff1a;"table.exec.m…

【力扣】快乐数,哈希集合+快慢指针+数学

快乐数原题地址 方法一&#xff1a;哈希集合 定义函数getNext(n)&#xff0c;返回n的所有位的平方和。一直执行ngetNext(n)&#xff0c;最终只有2种可能&#xff1a; n停留在1。无限循环且不为1。 证明&#xff1a;情况1是存在的&#xff0c;如力扣的示例一&#xff1a; 接…

怎么加密电脑磁盘?磁盘加密软件哪个好?

磁盘是电脑储存数据的基础工具&#xff0c;可以存放大量数据。为了避免数据泄露&#xff0c;可以使用专业的磁盘加密软件加密保护电脑磁盘。那么&#xff0c;磁盘加密软件哪个好呢&#xff1f;下面我们就来了解一下。 磁盘加锁专家 磁盘加锁专家是一款专业的磁盘加锁软件&…

阅读《极客时间 | Kafka核心技术与实战》(一)【Kafka入门】

阅读《极客时间 | Kafka核心技术与实战》 为什么要学习Kafka消息引擎系统ABC一篇文章带你快速搞定Kafka术语我应该选择哪种Kafka&#xff1f;聊聊Kafka的版本号 为什么要学习Kafka 如果你是一名软件开发工程师的话&#xff0c;掌握 Kafka 的第一步就是要根据你掌握的编程语言去…

使用CMSIS-DSP库进行嵌入式音频信号处理

在嵌入式环境下&#xff0c;使用CMSIS-DSP库进行音频信号处理是一种常见的应用场景。通过CMSIS-DSP库&#xff0c;开发人员可以利用嵌入式系统的处理能力来实现各种数字信号处理&#xff08;DSP&#xff09;功能&#xff0c;例如音频滤波、均衡器、噪音消除等。本文将介绍如何在…

C# 中的 out 参数传递

C# 是一种强大的编程语言&#xff0c;它提供了许多功能和特性来帮助开发人员编写高效和可维护的代码。其中&#xff0c;out 参数是 C# 中非常有用的一个特性之一。在本文中&#xff0c;我们将深入探讨 C# 中的 out 参数传递&#xff0c;并介绍它的用法、优势以及一些最佳实践。…

Dataway工具(一个接口竟然可以如此简单的配置出来无需开发任何一行代码,也不需要做任何 Mapping 实体映射绑定。)

基于 DataQL 服务聚合能力&#xff0c;为应用提供的一个接口配置工具&#xff0c;使得使用者无需开发任何代码就配置一个满足需求的接口。整个接口配置、测试、冒烟、发布&#xff0c;一站式都通过 Dataway 提供的 UI 界面完成。UI 会以 Jar 包方式提供并集成到应用中并和应用共…

Qt环境搭建+简单程序实现

Qt是什么 Qt是一个跨平台的C图形用户界面应用程序框架。 框架的本质就是一群大佬发明的让菜鸡写出来的代码也也比较规范 也就是限制程序员的自由&#xff0c;让程序员写出来的代码规范。 库和框架有相似性。 库是被程序员调用的&#xff0c;&#xff08;程序员是主体&…

【自动化测试】---Selenium+Java

1.自动化测试分类 接口自动化测试UI自动化测试&#xff08;移动端自动化测试、Web端自动化测试&#xff09; 2.选择Selenium作为web自动化工具原因&#xff08;面试题&#xff09; 开源免费支持多个浏览器支持多个系统支持多语言Selenium包提供很多供测试使用的API 3.自动化是什…

深入探索 Stable Diffusion:AI图像创新的新纪元

深入探索 Stable Diffusion&#xff1a;AI图像创新的新纪元 介绍 Stable Diffusion 的核心功能和应用场景Stable Diffusion 架构解析深入 Stable Diffusion 的关键组件变分自编码器&#xff08;VAE&#xff09;生成对抗网络&#xff08;GAN&#xff09;注意力机制优化算法数据集…

#Z0463. 巡逻1

Description 在一个地区中有 n 个村庄&#xff0c;编号为 1, 2, ..., n。有 n – 1 条道路连接着这些村 庄&#xff0c;每条道路刚好连接两个村庄&#xff0c;从任何一个村庄&#xff0c;都可以通过这些道路到达其 他任一个村庄。每条道路的长度均为 1 个单位。 为保证该地区的…

超实用的GPT使用三个明星技巧!

在我们对ChatGPT的基础能力有了一定的了解之后&#xff0c;我们就要开始在ChatGPT的基础上探索更多的可能性。 而ChatGPT本身的问题也很多&#xff0c;ChatGPT在使用上最大也最明显的革命&#xff0c;其实是对自然语言的处理能力&#xff0c;抛开太多专业性的术语&#xff0c;你…

漏电流的检测要求和理解

漏电流的检测要求和理解 简介漏电流的产生和效应标准要求漏电流的试验漏电流与电磁兼容的关系小结 简介 漏电流是指非功能性电流&#xff0c;是非期望的会引起安全方面危险的电流。漏电流表明了设备中电气绝缘起到防电击作用具有的性能&#xff0c;以使穿过电气绝缘的电流控制…

linux中dup/dup2/fcntl函数的简单使用

dup函数&#xff1a; 作用&#xff1a;复制文件描述符 原型&#xff1a;int dup(int oldfd); oldfd是要复制的文件描述符 函数返回值&#xff1a; 成功返回最小且未被占用的文件描述符 失败返回-1 newfd dup(int oldfd); 注意&#xff1a;在调用dup函数时&#xff0c…

零基础学编程从哪里入手,编程实例分享,配件进出库管理系统软件

零基础学编程从哪里入手&#xff0c;编程实例分享&#xff0c;配件进出库管理系统软件 一、前言 对于刚学编程的人来说&#xff0c;多看看现有的软件实例对自己学开发软件是很有帮助的。 下面分享的实例以配件进出库管理系统软件为例说明。 软件文件下载可以点击最下方官网…

Qwen-VL 技术报告总结

感谢如此优秀的开源工作,仓库链接 Qwen-VL 权重分为 Qwen-VL && Qwen-VL-Chat&#xff0c;区别文档稍后介绍 训练过程 在第一阶段中主要使用224X224分辨率训练&#xff0c;训练数据主要来源是公开数据集&#xff0c;经过清洗&#xff0c;数据总量大约是1.4B,中文数据…

canvas实现涂鸦画板功能

查看专栏目录 canvas实例应用100专栏&#xff0c;提供canvas的基础知识&#xff0c;高级动画&#xff0c;相关应用扩展等信息。canvas作为html的一部分&#xff0c;是图像图标地图可视化的一个重要的基础&#xff0c;学好了canvas&#xff0c;在其他的一些应用上将会起到非常重…

高考志愿填报模拟系统的功能和技术总结

一、金秋志愿高考志愿填报系统主要功能&#xff1a; 用户注册与登录&#xff1a;允许学生和家长注册账号&#xff0c;使用注册的账号登录系统。 个人信息管理&#xff1a;允许用户查看、修改个人信息&#xff0c;如姓名、性别、联系方式等。 高考成绩输入&#xff1a;学生输…
最新文章