当前位置: 首页 > news >正文

【C++】const成员

个人主页 : zxctscl
如有转载请先通知

文章目录

  • 1. 前言
  • 2. const成员
  • 3. 取地址及const取地址操作符重载

1. 前言

在之前已经已经分享过了关于 【C++】类和对象之常引用与运算符重载,这次分享的有关const的内容,话不多说,正文开始。

2. const成员

将const修饰的“成员函数”称之为const成员函数,const修饰类成员函数,实际修饰该成员函数隐含的this指针,表明在该成员函数中不能对类的任何成员进行修改。
在这里插入图片描述
看看下面的代码

class Date
{
public:Date(int year, int month, int day){_year = year;_month = month;_day = day;}void Print(){cout << _year << "/" << _month << "/" << _day << endl;}private:int _year; int _month; int _day; 
};
int main()
{const Date d1(2024, 1, 1);d1.Print();return 0;
}

在这里插入图片描述
在这里为什么不能调用printf呢?
在这里插入图片描述
为了解决这个问题在函数后面加const
在这里插入图片描述
这个是权限的平移。
在这里插入图片描述

#include <iostream>
using namespace std;class Date
{
public:Date(int year, int month, int day){_year = year;_month = month;_day = day;}void Print()const{cout << _year << "/" << _month << "/" << _day << endl;}private:int _year;int _month;int _day;
};int main()
{const Date d1(2024, 1, 31);d1.Print();Date d2(2024, 3, 31);d2.Print();return 0;
}

如果是像d2呢?
在这里插入图片描述
也可以用printf,这里是权限的缩小。

在这里插入图片描述
并不是所有的函数都能加上const。
总之:
成员函数,如果是一个对成员变量只进行读访问的函数,建议加const,这样const对象和非const对象都能使用。
成员函数,如果是一个对成员变量进行读写访问的函数,不加const,否则不能修改成员变量。
在这里插入图片描述
下面代码是权限放大吗?
不是,这里是拷贝,j的改变不影响i,也不存在所谓的权限方法。
在这里插入图片描述

这个才是权限的放大,r的改变影响i。
在这里插入图片描述

在这里插入图片描述
p2的改变会影响p1,也就是i。

权限的放大:指针和引用赋值才存在权限放大。
在这里插入图片描述

来看看下面的几个问题:

  1. const对象可以调用非const成员函数吗?
    不行,权限放大了

  2. 非const对象可以调用const成员函数吗?
    可以,这里权限缩小

  3. const成员函数内可以调用其它的非const成员函数吗?
    不行,权限放大了

  4. 非const成员函数内可以调用其它的const成员函数吗?
    可以,这里是权限的缩小

3. 取地址及const取地址操作符重载

在这里插入图片描述
如果&不是默认成员函数,那么重载才能使用。
如果每次使用都要重载,那么编译器就直接默认生成。
在这里插入图片描述

这两个默认成员函数一般不用重新定义 ,编译器默认会生成,不需要自己写,日常已经够用了。

class Date
{
public:Date* operator&(){return this;}const Date* operator&()const{return this;}
private:int _year; // 年int _month; // 月int _day; // 日
};

这两个运算符一般不需要重载,使用编译器生成的默认取地址的重载即可。

只有特殊情况,才需要重载,比如想让别人获取到指定的内容!
像这样普通对象能拿地址,const对象不能拿地址。
在这里插入图片描述

在这里插入图片描述

有问题请指出,大家一起进步!!!

http://www.lryc.cn/news/310103.html

相关文章:

  • 利用小蜜蜂AI智能问答ChatGPT+AI高清绘图生成图文故事案例
  • Github项目推荐-LightMirrors
  • day14:栈排序
  • 【LeetCode:2368. 受限条件下可到达节点的数目 + BFS】
  • pyorbbecsdk奥比中光python版本SDK在Windows下环境配置笔记
  • YOLOV8介绍
  • 【ElfBoard】基于 Linux 的智能家居小项目
  • 自动化测试介绍、selenium用法(自动化测试框架+爬虫可用)
  • 深度学习的一个完整过程通常包括以下几个步骤
  • WPS如何共享文件和文件夹
  • PowerData 2024“数字经济-城市开源行”活动预告
  • QT多语言切换功能
  • windows上elasticsearch的ik分词器的安装
  • 基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的口罩识别系统(Python+PySide6界面+训练代码)
  • 在Windows系统中启动Redis服务
  • k8s.gcr.io/pause:3.2镜像丢失解决
  • 全面整理!机器学习常用的回归预测模型
  • 在vue中对keep-alive的理解,它是如何实现的,具体缓存的是什么?
  • 章节一、认识three.js与开发环境学习笔记01;
  • QT摄像头采集
  • C语言第三十四弹---动态内存管理(下)
  • PDN分析及应用系列二-简单5V电源分配-Altium Designer仿真分析-AD
  • Vue开发实例(一)Vue环境搭建第一个项目
  • 将SpringBoot项目改造成solon项目
  • 更详细的软件测试理论基础:流程,开发、测试模型,测试分类,测试用例及其设计方法,缺陷
  • input css padding
  • 如何打印 springboot 框架中 接收请求的日志
  • JVM的内存区域划分
  • YOLOv9有效改进|使用动态蛇形卷积Dynamic Snake Convolution
  • 设计模式学习笔记 - 设计原则 - 1.单一职责原则