常静相伴:深度解析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.mzph.cn/news/62022.shtml

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

相关文章

时间切片

1. 下次绘制交互 (INP) 下次绘制交互 (INP) 是一项新的指标&#xff0c;浏览器计划于 2024 年 3 月将其取代取代首次输入延迟 (FID) &#xff0c;成为最新的 Web Core Vitals(Web 核心性能指标)。 2. 时间切片-scheduler.yield 背景&#xff1a;用户任务完成自动释放控制权给主…

打怪(easy)

B-打怪(easy)_第二十届同济大学程序设计竞赛&#xff08;同步赛&#xff09; (nowcoder.com) 问题描述&#xff1a;初始攻击是1&#xff0c;防御是0&#xff0c;血量无穷。怪物防御力永远为0&#xff0c;只有初始血量和攻击力。双方每次受到的攻击会掉对手攻击-自己防御的血量…

[golang 流媒体在线直播系统] 1.直播的简单介绍以及借助腾讯云直播实现在线直播

一.直播的简单介绍 1.介绍 直播,应该不陌生,有电视直播、网络主播、游戏直播、体育直播、在线教育直播等等,那么要实现在线直播的话就 必须要有 “ 流媒体在线直播服务器 ”. “流媒体在线直播服务器 ”不仅可以 实现游戏、赛事、电商、媒体、教育等行业的直播, 还可以实现 …

java八股文面试[多线程]——并发三大特性 原子 可见 顺序

AutomicInteger : volatile CAS 总线LOCK MESI 两个协议 TODO volatile的可见性和禁止重排序是怎么实现的&#xff1a; DCL场景&#xff1a; new操作会在字节码层面生成两个步骤&#xff1a; 分配内存、调用构造器 然后把引用赋值给singleton 不加volatile则会发生指令重…

Docker从认识到实践再到底层原理(二-2)|Namespace+cgroups

前言 那么这里博主先安利一些干货满满的专栏了&#xff01; 首先是博主的高质量博客的汇总&#xff0c;这个专栏里面的博客&#xff0c;都是博主最最用心写的一部分&#xff0c;干货满满&#xff0c;希望对大家有帮助。 高质量博客汇总 然后就是博主最近最花时间的一个专栏…

ssm+vue乐购游戏商城系统源码和论文

ssmvue乐购游戏商城系统源码和论文115 开发工具&#xff1a;idea 数据库mysql5.7 数据库链接工具&#xff1a;navcat,小海豚等 技术&#xff1a;ssm 摘 要 随着社会的发展&#xff0c;游戏品种越来越多&#xff0c;计算机的优势和普及使得乐购游戏商城系统的开发成为必需…

mysql 表备份 遇到的问题 【全网最全】

目录 省流&#xff1a; 正文&#xff1a; 1、报错 2、原因 3、解决方法 方法一&#xff1a;关闭 ENFORCE_GTID_CONSISTENCY &#xff08;不推荐&#xff09;&#xff1a; 方法二&#xff08;推荐&#xff09;&#xff1a; 4、开启关闭GTID 省流&#xff1a; 不推荐如…

Databricks 入门之sql(二)常用函数

1.类型转换函数 使用CAST函数转换数据类型&#xff08;可以起别名&#xff09; SELECTrating,CAST(timeRecorded as timestamp) FROMmovieRatings; 支持的数据类型有&#xff1a; BIGINT、BINARY、BOOLEAN、DATE 、DECIMAL(p,s)、 DOUBLE、 FLOAT、 INT、 INTERVAL interva…

SpringBatch简述

前言 ​ 如今微服务架构应用增多&#xff0c;但在企业里还存在海量数据的批处理场景。诸如银行的金融机构中&#xff0c;每天有3-4万笔的批处理作业需要处理。而常见处理方案有&#xff1a; 1、数据脚本跑批 2、批处理框架 3、多线程事务处理方案。 ​ 在满足基本功能之外…

自智网络简介

网络随着业务和流量的发展&#xff0c;已经变的无比复杂&#xff0c;很难通过人力管理&#xff0c;因此业界提出了自智网络(自动驾驶网络)的概念。普林斯顿大学的Nick Feamster和Jennifer Rexford在本文中探讨了为什么网络需要自动化&#xff0c;以及达成这一目标的路径。原文:…

自制centos7.9的wsl发行版

自制centos7.9的wsl发行版 参考&#xff1a;https://zhuanlan.zhihu.com/p/482538727 Windows10提供了一个wsl工具用于直接在windows上运行Linux子系统。 CentOS国内镜像下载&#xff1a;https://mirrors.aliyun.com/centos/ 这里选择了7.9.2009版本&#xff1a;https://mirr…

android studio git没有显示Local Changes界面

设置android studio git没有显示Local Changes界面 Setting -> Version Control-> commit -> 把use non-modal commit interface 的勾勾去掉&#xff0c;如下图所示 然后点击apply&#xff0c;回到git界面就看到了&#xff0c;亲测有效

2023年7月京东护发市场数据分析(京东数据产品)

如今&#xff0c;与面部护肤相比&#xff0c;多数消费者认为头皮也需要认真对待&#xff0c;这在年轻消费群体中体现的较为明显。 随着消费者对护发理念的认同感不断加深&#xff0c;人们日常居家洗护的步骤也更加精细、使用产品品类也愈加多样化。除传统的护发素、发膜等护发…

Web3 社交平台如何脱颖而出?我们和 PoPP 聊了聊

能够颠覆 Web2 传统模式的社交产品有着怎样的特征&#xff1f;PoPP 作为专注于 Web3 的私域流量变现平台&#xff0c;为开发者和用户提供了社交产品发展的新路径&#xff0c;让社区用户充分实现互动交流&#xff0c;着力于创作内容的激励与变现。事实上&#xff0c;面对 Web3 社…

c语言自定义头文件是什么情况下使用?一般在什么情况下引用自定义的头文件?一般在自定义头文件中写什么代码?

c语言自定义头文件是什么情况下使用&#xff1f;一般在什么情况下引用自定义的头文件&#xff1f;一般在自定义头文件中写什么代码&#xff1f; C语言自定义头文件是一种用来封装函数和变量声明的文件&#xff0c;它通常用于将一组相关的函数和变量的声明集中在一个地方&#…

电脑可以上网,微信都可以用,但浏览器打不开网页

可以试试设置DNS&#xff08;其他windows版本步骤&#xff09;&#xff1a; 1.打开控制面板 2.网络和Internet 3.查看网络计算机和设备 4.按照下图步骤&#xff1a; 5.按下图进行

WorkPlus Meet支持企业局域网内部使用的视频会议系统

在当今飞速发展的数字时代&#xff0c;企业内部协作和沟通变得愈发多元化和重要。与此同时&#xff0c;随着数据泄露和信息安全风险的威胁不断升级&#xff0c;企业音视频沟通在各个业务场景中的广泛应用。为了提高工作效率&#xff0c;实现信息共享与协同办公&#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…

c++之枚举

1、背景 在开发代码的过程中&#xff0c;vector类型数组a的index取了一个枚举值CTR&#xff0c;eg&#xff1a;a[CTR]&#xff0c;刚开始以为是map类型&#xff0c;后面看不是&#xff0c;简单的看了下c的enum类型&#xff0c;原来enum按顺序默认为数字。 2、enum简介 2.1、…

Spring与Mybatis整合aop整合pageHelper分页插件

前言 Spring与MyBatis整合的意义在于提供了一种结合优势的方式&#xff0c;以便更好地开发和管理持久层&#xff08;数据库访问&#xff09;代码。 这里也是总结了几点主要意义 简化配置&#xff1a;Spring与MyBatis整合后&#xff0c;可以通过Spring的配置文件来管理和配置M…