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

常静相伴:深度解析C++中的const与static关键字

  •  个人主页:北·海
  •  🎐CSDN新晋作者
  •  🎉欢迎 👍点赞✍评论⭐收藏
  • ✨收录专栏:C/C++
  • 🤝希望作者的文章能对你有所帮助,有不足的地方请在评论区留言指正,大家一起学习交流!🤗

目录

前言 

一.“大众情人”:静态数据成员

二.永葆初心之常成员-const

1.const数据成员的初始化方式:

2.const修饰的对象与成员函数

 结语:


前言 

 在C++中,const和static是两个重要的关键字,它们分别用于声明常量和静态成员。const用于指定一个值在程序运行期间将保持不变,提高代码的可读性和安全性;而static用于指定一个成员在类的所有实例之间共享,提供静态的存储和管理方式。理解const和static的概念以及正确应用它们可以帮助我们编写更健壮和高效的C++代码。

一.大众情人”:静态数据成员

思考一个问题

在c++中,创建对象时候,你不定义全局变量的情况下,如何实现?

  在类中定义一个变量吗?

class Human{private:int count= 0;//使用类内初始值public:Human(){count++;
}};

这种方法肯定是行不通的,因为每个对象都有一个count变量,每个对象的count初始值为0,然后再执行构造函数,最终的结果是,无论有多少个对象,每个对象的count值都为1

1.如果在c语言中分文件的开发模式下,如何定义全局变量和访问呢?

Human.cpp#include "Human.h"
int count = 0;Human::Human() {count++;
}
int Human::getAge() {return age;
}void Human::setAge(int age) {this->age = age;
}
int Human::getCount() {return count;
}
Human.h文件#pragma once
extern int count;class Human {private:int age;
public:Human();void setAge(int age);int getAge();int getCount();
};
main.cpp文件#include <iostream>
#include "Human.h"
using namespace std;int main() {Human m1,m2,m3;cout << "总人数" << m1.getCount() << endl;
}

根据上面再c语言中使用extern进行全局变量的分文件开发还是很麻烦的,再c++中可以使用静态变量进行实现

2.C++中解决定义全部变量的方式

关键字 : static

当定义为静态变量时候,该变量就不会在栈区了,不属于任何一个对象,而是属于整个类

定义方法 : 可以再Human.h文件类中进行先声明,例如  

Human{
private:static int count;//声明非常量的静态成员变量
const static int count = 0 ;//常量静态成员变量};

对于非const的类静态成员,只能在类的实现文件中初始化。

const类静态成员,可以在类内设置初始值,也可以在类的实现文件中设置初始值。(但是不要同时在这两个地方初始化,只能初始化1次)

在给非常量静态成员变量赋值的方法

int Human :: count = 0;
格式 :  变量类型 类名 :: 变量名 = 初始值;

给非常量静态变量可以直接定义赋值,必须在类外

static int a = 10;
可以在类外的任何地方进行定义

在声明中,不能直接对非常量静态成员变量赋值,但是可以给常量静态成员变量在声明时赋值

3.哪些函数可以访问静态成员变量

1) 类的普通成员函数,可以直接访问静态成员(可读可写)

class Human{private:
static int a = 0 ;public:int getA(){
a++;//可以对静态成员变量进行改写return a;//可读}
};

2) 静态普通函数

问题:当在非静态普通函数里,如何去访问静态成员变量

void test() {cout << "总人数: ";// ??? 没有可用的对象来访问getCount()
}

如果为了访问总的人数,而特意去创建一个对象,就很不方便,而且得到的总人数还不真实(包含了一个没有实际用处的人)

访问方式:

通过对象访问,此时会与预期结果不符合

通过类来访问

由此可以看出,通过类也不能访问到,此时可以将getcount函数改为static类型的

解决方法:

将getCount函数定义为static,此时就可以访问到了

类的静态方法:

  1. 可以直接通过类来访问【更常用】,也可以通过对象(实例)来访问。
  2. 在类的静态方法中,不能访问普通数据成员和普通成员函数(对象的数据成员和成员函数)

3.静态方法中,不能访问this指针,因为this指针是属于实例对象的

4.静态方法中,只能访问静态数据成员

总结 :

1) .静态数据成员

对象的成员函数(没有static的成员函数)内部,可以直接访问“静态数据成员”

类的静态成员函数(有static的成员函数)内部,可以直接访问“静态数据成员”

即:所有的成员函数,都可以访问静态数据成员

类不能直接访问普通的静态数据成员

2) .静态成员函数

对象可以直接访问静态成员函数

类可以直接访问静态成员函数

在类的静态成员函数(类的静态方法)内部,不能直接访问this指针和对象的数据成员!

在类的静态成员函数(类的静态方法)内部,只能访问类的数据成员

最后两句对象的数据成员函数只得就是非静态的成员变量,类的数据成员函数,此时这个成员函数属于整个类,前面已经提到过,此时指的就是static修饰的成员变量

二.永葆初心之常成员-const

1.const数据成员的初始化方式:

  • 使用类内值(C++11支持)
class Test{private:const int a = 1;...
};
  • 使用构造函数的初始化列表
class A{private:const int a;
public:A(int _a):a(_a){}};

(如果同时使用这两种方式,以初始化列表中的值为最终初始化结果)

注意: 不能在构造函数或其他成员函数内,对const成员赋值!

2.const修饰的对象与成员函数

【类比】:专一男就是const对象,撩妹方法,就是普通的成员函数,如果允许专一男调去撩妹,那么专一男,也就不专一了!

以下示例:const对象访问普通成员函数

解决方案:

如果一个成员函数内部,不会修改任何数据成员,就把它定义为const成员函数。此时只需要输出a的值,所以将print函数,定义为const类型

注意const的放置位置

总结 : 如果声明的对象只去访问不改变值得函数,则可以将对象用const修饰,如果该成员函数内只读,则也将该函数用const修饰,const对象只能访问const修饰得成员函数,普通对象可以访问任意成员函数,

 结语:

在C++中,const和static是两个强大的关键字,它们为我们提供了更加丰富和灵活的编程工具。const使得代码更加安全可靠,通过禁止对常量进行修改确保程序的正确性。static则提供了一种在类的所有实例之间共享数据和行为的机制,有助于节约内存和简化程序结构。深入理解const和static的特性和使用方式,我们能够更加自如地控制数据的可变性和访问方式,编写出更稳定、可扩展和易于维护的代码。const和static是C++编程中的重要概念,它们的合理运用将大大提升代码质量和开发效率。


 

相关文章:

常静相伴:深度解析C++中的const与static关键字

个人主页&#xff1a;北海 &#x1f390;CSDN新晋作者 &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏✨收录专栏&#xff1a;C/C&#x1f91d;希望作者的文章能对你有所帮助&#xff0c;有不足的地方请在评论区留言指正&#xff0c;大家一起学习交流&#xff01;&#x1f9…...

Linux入门之进程信号|信号产生的方式

文章目录 一、信号入门 1.linux信号的基本概念 2.使用kill -l 命令可以查看系统定义的信号列表 3.信号处理常见方式 二、产生信号 1.通过终端按键产生信号 2.通过调用系统函数向进程发信号 3.由软条件产生信号 4.硬件异常产生信号 1. /0异常 2.模拟野指针 一、信号入门…...

Unity中的数学基础——贝塞尔曲线

一&#xff1a;前言 一条贝塞尔曲线是由一组定义的控制点P0到 Pn&#xff0c;n1为线性&#xff0c;n2为二次......第一个和最后一个控制点称为起点和终点&#xff0c;中间的控制点一般不会位于曲线上 获取两个点之间的点就是通过线性插值&#xff08; Mathf.Lerp&#xff09…...

大数据平台安全主要是指什么安全?如何保障?

大数据时代已经来临&#xff0c;各种数据充斥着我们的生活与工作。随着数据的多样性以及复杂性以及大量性&#xff0c;大数据平台诞生了。但对于大数据平台大家都不是很了解&#xff0c;有人问大数据平台安全主要是指什么安全&#xff1f;如何保障&#xff1f; 大数据平台安全…...

Flutter的未来与趋势,23年还学吗?

随着移动应用市场的不断扩大&#xff0c;跨平台开发框架的需求也越来越大。Flutter框架可以帮助开发者在不同平台上快速开发高质量的移动应用程序&#xff0c;这种趋势将进一步推动Flutter的发展和普及。 作为一名前端开发工程师&#xff0c;学习Flutter框架是非常有必要的。因…...

RHCE——十三、Shell自动化运维编程基础

Shell 一、为什么学习和使用Shell编程二、Shell是什么1、shell起源2、查看当前系统支持的shell3、查看当前系统默认shell4、Shell 概念 三、Shell 程序设计语言1、Shell 也是一种脚本语言2、用途 四、如何学好shell1、熟练掌握shell编程基础知识2、建议 五、Shell脚本的基本元素…...

深入理解AMBA总线协议(AXI总结篇)

AXI总线已经是AMBA总线中最常见&#xff0c;使用最频繁的总线&#xff0c;并且没有之一。 可以说AXI总线已经成为了片上总线中最重要的协议&#xff0c;本篇文章打算花一些篇幅&#xff0c;帮大家总结一下AXI总线的学习重点、学习难点&#xff0c;以帮助大家更好更快的掌握AXI…...

建立无需build的react单页面应用SPA框架(2)

react-18.1.0&#xff0c;rc-easyui-1.2.9&#xff0c;babel-7.17.11 SPA还要处理的问题&#xff1a; &#xff08;一&#xff09;tabs切换事件通知 tabs切换时&#xff0c;自己的框架需要处理组件的生命周期&#xff0c;要有active/deactive&#xff0c;让组件能知道何时创…...

C# char曲线控件

一、char曲线显示随机数数据 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Runtime.InteropServices; using System.Text; using System.Threading; using Syst…...

远程访问本地jupyter notebook服务 - 无公网IP端口映射

文章目录 前言1. Python环境安装2. Jupyter 安装3. 启动Jupyter Notebook4. 远程访问4.1 安装配置cpolar内网穿透4.2 创建隧道映射本地端口 5. 固定公网地址 前言 Jupyter Notebook&#xff0c;它是一个交互式的数据科学和计算环境&#xff0c;支持多种编程语言&#xff0c;如…...

flume系列之:记录一次消费大量Debezium数据,数据包含dml语句比较大,造成数据堆积在channel的解决方法

flume系列之:记录一次消费大量Debezium数据,数据包含dml语句比较大,造成数据堆积在channel的解决方法 一、背景二、相关技术博客三、flume层面解决方法四、debezium数据采集层面解决方法一、背景 Debezium采集了大量的数据,数据包含DMl语句,数据本身比较大。flume消费了大…...

Could not find artifact com.pageOffice:pageOffice:pom:4.3.0.2 in aliyunmaven

Could not find artifact com.pageOffice:pageOffice:pom:4.3.0.2 in aliyunmaven (https://maven.aliyun.com/repository/public) 仓库服务 阿里云云效 Maven 是什么 阿里云Maven中央仓库为 阿里云云效 提供的公共代理仓库&#xff0c;帮助研发人员提高研发生产效率&#x…...

2023年9月数据治理/项目管理/产品管理/商务礼仪企业内训定制

在节奏飞驰、风起云涌的企业世界中&#xff0c;为了企业的蓬勃发展&#xff0c;可以在内部或者外部挑选有经验的老师进行培训和学习。简而言之&#xff0c;任何一个企业想要发展&#xff0c;都少不了进行内训。 企业内训的好处 提高员工的技能和知识水平 通过不断地学习和培训…...

后端面试话术集锦第 九 篇:Activiti工作流面试话术

这是后端面试集锦第九篇博文——Activiti工作流面试话术❗❗❗ 1. 工作流话术 工作流这块儿,实际在工作中使用的时候,Activiti用的居多,当然还有一些其他的工作流引擎。 在网上看了也大概看了一下,其他的像JBPM以及workflow等用的情况来讲不是很多。 所以说Activiti目前…...

JS中方法、函数、属性是一个东西吗

在 JavaScript 中&#xff0c;方法、函数和属性是相关但不完全相同的概念。 方法&#xff08;Method&#xff09;&#xff1a;在对象中&#xff0c;方法是对象的属性&#xff0c;但它的值是一个函数。方法可以通过对象来调用&#xff0c;并且可以访问对象的属性和其他方法。 …...

面经:微服务

文章目录 参考资料一. 微服务概述1. CAP理论2. BASE理论3. SpringBoot 与 SpringCloud对比 二. 服务注册&#xff1a;Zookeeper,Eureka,Nacos,Consul1. Nacos两种健康检查方式&#xff1f;2. nacos中负责负载均衡底层是如何实现的3. Nacos原理4. 临时实例和持久化(非临时)实例 …...

K8s 持久化存储有几种方式?一文了解本地盘/CSI 外接存储/K8s 原生存储的优缺点

当今云原生环境中&#xff0c;Kubernetes&#xff08;K8s&#xff09;已成为既定的容器编排工具。随着 K8s 的普及&#xff0c;存储也成为 K8s 用户关注的一个重要问题&#xff1a;为了满足不同的场景需求&#xff0c;K8s 可以支持基于不同架构的多种存储方案。这些方案间有什么…...

【MySQL】3、MySQL的索引、事务、存储引擎

create table class (id int not null,name char(10),score decimal(5,2)); insert into class values (1,zhangsan,80.5); update class set namewangwu,passwd123 where id2; select * from class where id2; drop 索引的概念 是一种帮助系统&#xff0c;能够更快速的查询信…...

【Hello Algorithm】链表相关算法题

本篇博客介绍&#xff1a; 介绍下链表相关的算法题 链表相关算法题 快慢指针回文结构链表将单向链表按某值划分为左边小&#xff0c;中间相等&#xff0c;右边大的形式复制带随机指针的链表 链表相关的算法题其实都算不上难 我们真正要考虑的是一些边界问题 事实上链表题就是在…...

自动化管理管理工具----Ansible

目录 ​编辑 一、Ansible概念 1.1特点 二、工作机制&#xff08;日常模块&#xff09; 2.1 核心程序 三、Ansible 环境安装部署 四、ansible 命令行模块 4.1command 模块 4.2shell 模块 4.3cron 模块 4.4user 模块 4.5group 模块 4.6copy模块 4.7file模块 4.8ho…...

深入理解css3背景图边框

border-image知识点 重点理解 border-image-slice 设置的值将边框背景图分为9份&#xff0c;图像中间的舍弃&#xff0c;其他部分图像对应边框的相应区域放置&#xff0c;上右下左四角固定&#xff0c;border-image-repeat设置的是除四角外其他部分的显示方式。 截图来自菜鸟教…...

【rust/egui】(六)看看template的app.rs:TextEdit

说在前面 rust新手&#xff0c;egui没啥找到啥教程&#xff0c;这里自己记录下学习过程环境&#xff1a;windows11 22H2rust版本&#xff1a;rustc 1.71.1egui版本&#xff1a;0.22.0eframe版本&#xff1a;0.22.0上一篇&#xff1a;这里 TextEdit 文本编辑框 其定义为&#…...

Redis内存空间预估与内存优化策略:保障数据安全与性能的架构实践

推荐阅读 AI文本 OCR识别最佳实践 AI Gamma一键生成PPT工具直达链接 玩转cloud Studio 在线编码神器 玩转 GPU AI绘画、AI讲话、翻译,GPU点亮AI想象空间 资源分享 史上最全文档AI绘画stablediffusion资料分享 AI绘画关于SD,MJ,GPT,SDXL百科全书 「java、python面试题」…...

【zookeeper】zookeeper集群安装

环境规划 实际的生产使用中&#xff0c;我们一般推荐搭建奇数多节点的zookeeper集群&#xff0c;如3/5/7。在本次测试中&#xff0c;我使用了centos7 三台服务器搭建&#xff0c;复用了我搭建k8s集群的环境&#xff0c;如下表。 IPhostname192.168.2.140k8s-m1192.168.2.141k…...

CUDA小白 - NPP(2) - Arithmetic and Logical Operations(1)

cuda小白 原文链接 NPP GPU架构近些年也有不少的变化&#xff0c;具体的可以参考别的博主的介绍&#xff0c;都比较详细。还有一些cuda中的专有名词的含义&#xff0c;可以参考《详解CUDA的Context、Stream、Warp、SM、SP、Kernel、Block、Grid》 常见的NppStatus&#xff0c…...

计算机视觉-LeNet

目录 LeNet LeNet在手写数字识别上的应用 LeNet在眼疾识别数据集iChallenge-PM上的应用 LeNet LeNet是最早的卷积神经网络之一。1998年&#xff0c;Yann LeCun第一次将LeNet卷积神经网络应用到图像分类上&#xff0c;在手写数字识别任务中取得了巨大成功。LeNet通过连续使用…...

Java 复习笔记 - 面向对象篇

文章目录 一&#xff0c;面向对象概述二&#xff0c;类和对象&#xff08;一&#xff09;类和对象的概述&#xff08;二&#xff09;定义类的补充注意事项 三&#xff0c;封装四&#xff0c;就近原则和this关键字&#xff08;一&#xff09;就近原则&#xff08;二&#xff09;…...

行业追踪,2023-08-31

自动复盘 2023-08-31 凡所有相&#xff0c;皆是虚妄。若见诸相非相&#xff0c;即见如来。 k 线图是最好的老师&#xff0c;每天持续发布板块的rps排名&#xff0c;追踪板块&#xff0c;板块来开仓&#xff0c;板块去清仓&#xff0c;丢弃自以为是的想法&#xff0c;板块去留让…...

科技资讯|苹果发布新专利:可在车内定位苹果的智能设备

根据美国商标和专利局近期公示的清单&#xff0c;苹果公司获得了一项名为《车内定位移动设备的系统和方式》专利&#xff0c;概述了在车内狭窄空间内如何定位 iPhone 等移动设备。 Find My 服务现阶段没有使用 UWB 来追踪 iPhone 或者 iPad&#xff0c;而是依赖 GPS 等相关辅…...

浅析Linux SCSI子系统:IO路径

文章目录 概述scsi_cmd&#xff1a;SCSI命令result字段proto_op字段proto_type字段 SCSI命令下发scsi_request_fnscsi_dev_queue_readyscsi_host_queue_ready SCSI命令响应命令请求完成的软中断处理 相关参考 概述 SCSI子系统向上与块层对接&#xff0c;由块层提交的对块设备的…...