常静相伴:深度解析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++编程中的重要概念,它们的合理运用将大大提升代码质量和开发效率。


 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/114786.html

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

相关文章

玩转 PI 系列-看起来像服务器的 ARM 开发板矩阵-Firefly Cluster Server

前言 基于我个人的工作内容和兴趣&#xff0c;想要在家里搞一套服务器集群&#xff0c;用于容器/K8s 等方案的测试验证。 考虑过使用二手服务器&#xff0c;比如 Dell R730, 还搞了一套配置清单&#xff0c;如下&#xff1a; Dell R7303.5 尺寸规格硬盘CPU: 2686v4*2 内存&a…

DBO优化SVM的电力负荷预测,附MATLAB代码

今天为大家带来一期基于DBO-SVM的电力负荷预测。 原理详解 文章对支持向量机(SVM)的两个参数进行优化&#xff0c;分别是&#xff1a;惩罚系数c和 gamma。 其中&#xff0c;惩罚系数c表示对误差的宽容度。c越高&#xff0c;说明越不能容忍出现误差,容易过拟合。c越小&#xff0…

链表OJ练习(1)

一、移除链表元素 本题为力扣原题203 题目介绍&#xff1a; 给你一个链表的头节点 head 和一个整数 val &#xff0c;请你删除链表中所有满足 Node.val val 的节点&#xff0c;并返回 新的头节点 。 列表中的节点数目范围在 0~10000内 1<Node.val<50 0<val<50 …

基于VUE3+Layui从头搭建通用后台管理系统(前端篇)十一:通用表单组件封装实现

一、本章内容 本章实现通用表单组件,根据实体配置识别实体属性,并自动生成编辑组件,实现对应数据填充、校验及保存等逻辑。 1. 详细课程地址: 待发布 2. 源码下载地址: 待发布 二、界面预览 三、开发视频 3.1 B站视频地址:

OpenCV

文章目录 OpenCV学习报告读取图片和网络摄像头1.1 图片读取1.2 视频读取1.1.1 读取视频文件1.1.2读取网络摄像头 OpenCV基础功能调整、裁剪图像3.1 调整图像大小3.2 裁剪图像 图像上绘制形状和文本4.1 图像上绘制形状4.2图像上写文字 透视变换图像拼接颜色检测轮廓检测人脸检测…

【Nacos】使用Nacos进行服务发现、配置管理

Nacos Nacos是 Dynamic Naming and Configuration Service 的首字母简称&#xff0c;一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。 版本说明&#xff1a;版本说明 alibaba/spring-cloud-alibaba Wiki GitHub <properties><java.version>…

传统分拣弊端明显,AI机器视觉赋能物流行业包裹分类产线数智化升级

随着电子商务的快速发展&#xff0c;物流行业的包裹数量持续增长&#xff0c;给物流企业带来了巨大的运营压力。目前&#xff0c;国内大型物流运转中心已开始采用机器视觉自动化设备&#xff0c;但多数快递公司处于半自动化状态&#xff0c;中小型物流分拣中心目前仍靠人工录入…

AI机器视觉赋能电池缺陷检测,深眸科技助力新能源行业规模化发展

新产业周期下&#xff0c;新能源行业风口已至&#xff0c;现代社会对于新能源电池产品需求量加大&#xff0c;对产品的质量安全也更加重视。当前&#xff0c;传统的检测方法已经不能满足新能源电池行业的发展&#xff0c;越来越多的厂商开始应用创新机器视觉技术与产品于生产环…

Python 实战之ChatGPT + Python 实现全自动数据处理/可视化详解

本文目录 一、引言 二、成果演示——口述式数据可视化 三、远原理述 四、实现过程 &#xff08;一&#xff09;环境配置 &#xff08;二&#xff09;申请OpenAI账号 &#xff08;一&#xff09;调用ChatGPT API &#xff08;二&#xff09;设计AI身份&#xff0c;全自动处理数据…

java基于微信小程序的讲座预约系统的研究与实现

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝30W、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 文章目录 1 简介2 技术栈第三章 系统分析3.1初步需求分析 3.2 系统用例分析3.2.1 公告管理用例分析3.2.2 系…

华为云新生代开发者招募

开发者您好&#xff0c;我们是华为2012UCD的研究团队 为了解年轻开发者的开发现状和趋势 正在邀请各位先锋开发者&#xff0c;与我们进行2小时的线上交流&#xff08;江浙沪附近可线下交流&#xff09; 聊聊您日常开发工作中的产品使用需求 成功参与访谈者将获得至少300元京…

实现智能指针shared_ptr(难度3)(源码与测试用例)

本作业主要考察&#xff1a;复制控制/动态内存管理/模板编程/基于引用计数的智能指针原理/测试驱动开发 实现代码完成下面的my_shared_ptr以及main函数中的测试用例 本实现主要是利用复制控制来增加引用计数实现智能指针。 #include <iostream> #include <vector&g…

骨传导耳机十大品牌怎么选,骨传导耳机十大品牌排行榜分享

作为一个拥有20多款骨传导耳机来说&#xff0c;我也算是资深的使用者了&#xff0c;在骨传导耳机刚开始兴起的时候&#xff0c;我就开始接触了&#xff0c;近几年越来越多的骨传导耳机品牌诞生&#xff0c;我也是入手了不少&#xff0c;所以也算是对骨传导耳机非常熟悉了&#…

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

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

亲测微信小程序备案流程,微信小程序如何备案,微信小程序备案所需准备资料

微信小程序为什么要备案&#xff0c;微信官方给出如下说明&#xff1a; 1、若微信小程序未上架&#xff0c;自2023年9月1日起&#xff0c;微信小程序须完成备案后才可上架&#xff1b; 2、若微信小程序已上架&#xff0c;请于2024年3月31日前完成备案&#xff0c;逾期未完成备案…

CSP的理解与绕过

文章目录 前言CSP简介CSP如何工作CSP指令CSP指令值 例题[AFCTF 2021]BABY_CSP 前言 刚学习完xss&#xff0c;把xsss-labs靶场都通了打算试试水&#xff0c;遇到此题[AFCTF 2021]BABY_CSP&#xff0c;借此机会学习下CSP CSP简介 Content Security Policy (CSP)内容安全策略&am…

华为OD七日集训第1期复盘 - 按算法分类,由易到难,循序渐进,玩转OD(文末送书)

目录 一、活动内容如下第1天、逻辑分析第2天、字符串处理第3天、数据结构第4天、双指针第5天、递归回溯第6天、二分查找第7天、贪心算法 && 二叉树 二、可观测性工程1、简介2、主要内容 大家好&#xff0c;我是哪吒。 最近一直在刷华为OD机试的算法题&#xff0c;坚持…

macOS Sonoma 14beta 7(23A5337a)更新发布,附黑/白苹果系统镜像

系统介绍&#xff08;镜像请前往黑果魏叔官网下载&#xff09; 黑果魏叔8 月 31 日消息&#xff0c;苹果今日向 Mac 电脑用户推送了 macOS 14 开发者预览版 Beta 7 更新&#xff08;内部版本号&#xff1a;23A5337a&#xff09;&#xff0c;本次更新距离上次发布隔了 8 天。 …

运营超5000万公里,再签700辆订单,嬴彻卡车NOA引领商用车自动驾驶商业化

从主动安全到智能驾驶&#xff0c;商用车自动驾驶商业化进程已经明显提速。 8月29日&#xff0c;嬴彻科技举办以“奔跑吧 卡车NOA”为主题的第二届嬴彻科技日&#xff0c;宣布嬴彻卡车NOA&#xff08;导航辅助驾驶&#xff09;已经突破5000万公里&#xff0c;并实现安全运营零…