【c++随笔07】常量、变量、static

news2024/11/28 16:46:17

【c++随笔07】常量、变量、static

    • 1、常量、变量
      • 1.1、声明变量
      • 1.2、使用常量
    • 2、static介绍
      • 2.1、static 局部变量
      • 2.2、static 全局变量
      • 2.3、C++ static静态成员变量
      • 2.4、C++ static静态成员函数详解

原创地址,https://zhengjunxue.blog.csdn.net/article/details/131677709
原创作者,郑同学的笔记

1、常量、变量

变量是内存变量的简称,用于存放数据。

1.1、声明变量

  • 变量在使用之前要先声明。

  • 语法:数据类型 变量名
    C++常用的数据类型有五种:整数(int)、浮点数(float和double)、字符(char)、字符串(string)和布尔(bool)。

变量在声明的时候可以赋初始值。
语法:数据类型 变量名=值

  • 1.2、变量的赋值
    语法:变量名=值

1.2、使用常量

常量是程序中固定不变的数据。

  • 2.1、宏常量
    一般在main函数的上面声明,用大写命名。
    语法:#define 常量名 值

  • 2.2、const修饰的变量
    在程序的任何地方都可以声明。
    语法:const 数据类型 常量名=值

  • 2.3、常量的特点
    程序中不允许改变常量的值,否则编译的时候会报错。

2、static介绍

我们通常将不需要被其他模块调用的全局变量或函数用 static 关键字来修饰,static 能够将全局变量和函数的作用域限制在当前文件中。

2.1、static 局部变量

static 除了可以修饰全局变量,还可以修饰局部变量,被 static 修饰的变量统称为静态变量(Static Variable)。

不管是全局变量还是局部变量,只要被 static 修饰,都会存储在全局数据区(全局变量本来就存储在全局数据区,即使不加 static)。

全局数据区的数据在程序启动时就被初始化,一直到程序运行结束才会被操作系统回收内存;对于函数中的静态局部变量,即使函数调用结束,内存也不会销毁。

网上的错误说法:全局数据区的变量只能被初始化(定义)一次,以后只能改变它的值,不能再被初始化,即使有这样的语句,也无效。------------------------如下demo,发现是可以重写初始化的

#include <iostream>
using namespace std;

static int g_static = 10;

void show()
{
	cout << g_static << endl;
}

int main(void)
{
	static int l_static =20;

	g_static = 11;
	l_static = 22;

	cout << "g_static  = " << g_static << endl;
	cout << "l_static = " << l_static << endl;
	show();

	return 0;
}

输出

在这里插入图片描述

2.2、static 全局变量

  • 全局变量定义在函数体外部,在全局数据区分配存储空间,且编译器会自动对其初始化。

  • 普通全局变量对整个工程可见,其他文件可以使用extern外部声明后直接使用。也就是说其他文件不能再定义一个与其相同名字的变量了(否则编译器会认为它们是同一个变量)。

  • 静态全局变量仅对当前文件可见,其他文件不可访问,其他文件可以定义与其同名的变量,两者互不影响。

在定义不需要与其他文件共享的全局变量时,加上static关键字能够有效地降低程序模块之间的耦合,避免不同文件同名变量的冲突,且不会误使用。

函数
函数的使用方式与全局变量类似,在函数的返回类型前加上static,就是静态函数。其特性如下:

  • 静态函数只能在声明它的文件中可见,其他文件不能引用该函数
    不同的文件可以使用相同名字的静态函数,互不影响

1、c语言中文网——C语言static变量和函数
2、C语言 static变量和函数详解

2.3、C++ static静态成员变量

对象的内存中包含了成员变量,不同的对象占用不同的内存(已在《C++对象的内存模型》中提到),这使得不同对象的成员变量相互独立,它们的值不受其他对象的影响。例如有两个相同类型的对象 a、b,它们都有一个成员变量 m_name,那么修改 a.m_name 的值不会影响 b.m_name 的值。

可是有时候我们希望在多个对象之间共享数据,

  • 在C++中,我们可以使用静态成员变量来实现多个对象共享数据的目标。静态成员变量是一种特殊的成员变量,它被关键字static修饰。

静态成员: 在C++中,静态成员是类的成员,它被该类的所有实例所共享,而不是每个实例都有自己的独立副本。以下是使用静态成员的示例代码:

#include <iostream>

class MyClass {
public:
    static int count; // 声明静态成员变量

    MyClass() {
        count++;
    }
};

int MyClass::count = 0; // 初始化静态成员变量

int main() {
    MyClass obj1;
    MyClass obj2;
    MyClass obj3;

    std::cout << "Count: " << MyClass::count << std::endl;

    return 0;
}

输出结果:

Count: 3

在上面的示例中,MyClass类中的count是一个静态成员变量。每次创建MyClass的实例时,构造函数会自增count。由于count是静态的,因此它将被所有实例所共享,并且在整个程序运行期间只能有一个副本。在main函数中,我们创建了三个MyClass的实例,然后通过MyClass::count访问静态成员变量并输出其值。

static 成员变量的内存既不是在声明类时分配,也不是在创建对象时分配,而是在(类外)初始化时分配。反过来说,没有在类外初始化的 static 成员变量不能使用。

2.4、C++ static静态成员函数详解

在类中,static 除了可以声明静态成员变量,还可以声明静态成员函数。
普通成员函数可以访问所有成员(包括成员变量和成员函数),

  • 静态成员函数只能访问静态成员。

静态成员函数: 静态成员函数不依赖于任何特定的对象,而是属于整个类。因此,我们可以在没有创建类的实例对象的情况下直接调用静态成员函数。
以下示例演示了如何声明和使用静态成员函数:

class MathUtils {
public:
    static int multiply(int a, int b) {  // 静态成员函数声明
        return a * b;
    }
};

int main() {
    int result = MathUtils::multiply(3, 4);  // 调用静态成员函数

    cout << "Result: " << result << endl;

    return 0;
}

在上述示例中,我们声明了一个名为multiply的静态成员函数,并在程序的主函数中通过MathUtils::multiply直接调用它。

需要注意的是,静态成员函数只能访问静态成员变量和其他静态成员函数,它们无法直接访问非静态的成员变量和成员函数。

静态成员的使用为我们提供了一种在类和对象之间共享数据和行为的机制。通过合理地使用静态成员,可以提高代码的可维护性和可扩展性。

C++ static静态成员函数详解

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

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

相关文章

偏微分方程的人工智能

9 偏微分方程的人工智能 在本节中&#xff0c;我们详细介绍了用于解决偏微分方程&#xff08;Partial Differential Equations&#xff0c;PDEs&#xff09;的人工智能领域的进展。我们在第9.1节中概述了PDE建模的一般形式&#xff0c;并阐述了在这个背景下使用机器学习方法的…

前端两年半,CSDN创作一周年

文章目录 一、机缘巧合1.1、起因1.2、万事开头难1.3、 何以坚持&#xff1f; 二、收获三、日常四、憧憬 五、总结 一、机缘巧合 1.1、起因 最开始接触CSDN&#xff0c;还是因为同专业的同学&#xff0c;将计算机实验课的实验题&#xff0c;记录总结并发在了专业群里。后来正式…

Airtest1.2.7新增断言API介绍

1. 前言 1.2.7版本的Airtest中&#xff0c;一个很重要的功能是 新增了非常丰富的断言API &#xff0c;今天我们就来详细看一下Airtest都给我们提供了哪些断言语句。 2. 旧版Airtest提供的断言语句 先回顾下&#xff0c;旧版Airtest一直以来&#xff0c;都只给我们提供了2种断言…

软件工程与计算(一)软件工程基础

国庆快乐&#xff0c;今天开始更新《软件工程与计算&#xff08;卷二&#xff09;》的重要知识点内容~ 一.软件 1.软件独立于硬件 早期的软件是为了计算机硬件在研究型项目中而开发制造的&#xff0c;人们使用专门针对于硬件的指令码和汇编语言编写&#xff0c;这也是最早软件…

中文符号雨python

参考地址 字体地址也可以自己找一下资源 import pygame import randomdef main():# 初始化pygamepygame.init()# 默认不全屏fullscreen False# 窗口未全屏宽和高WIDTH, HEIGHT 1000, 600init_width, init_height WIDTH, HEIGHT# 字块大小&#xff0c;宽&#xff0c;高sufac…

【计算机网络】网络层-控制平面(学习笔记)

一、路由原理 1、网络层功能 1&#xff09;数据平面 转发&#xff1a;将分组从路由器的一个输入端口移到合适的输出端口 2&#xff09;控制平面 路由&#xff1a;确定分组从源到目标的路径 2、路由算法 路径长度可靠性延迟带宽负载通信代价 3、路由的原则 1&#xff0…

2021-06-11 51蛋骗鸡用小数点作秒指示,分钟计时.(怎么用二个数码管做分的倒计时,DP亮灭来计秒)

缘由怎么用二个数码管做分的倒计时&#xff0c;DP亮灭来计秒,求思路 - 24小时必答区 #include "REG52.h" sbit K1 P1^5; sbit K2 P1^6; sbit K3 P1^7; sbit BUZ1P1^0; bit k0; unsigned char code SmZiFu[]{63,6,91,79,102,109,125,7,127,111,128};//0-9. unsign…

4. 条件查询

首先区分下match&#xff0c;match_phrase,term, 参考&#xff1a;https://zhuanlan.zhihu.com/p/592767668?utm_id0 1、全量查询分页指定source 示例&#xff1a;请求地址为http://127.0.0.1:9200/students/_search&#xff0c;请求体为&#xff1a; {"query":…

git使用,一点点

查看自己有没有安装git git --version 如果没有安装请执行sudo yum install -y git来安装 git 指令 git log 查看日志 git pull 同步远端和本地仓库 这就是冲突的报错&#xff1a; 所以这个时候你要同步一下git pull

MATLAB中d2d函数用法

目录 语法 说明 示例 重新采样离散时间模型 重新采样已识别的离散时间模型 d2d函数的功能是重新采样离散时间模型。 语法 sys1 d2d(sys, Ts) sys1 d2d(sys, Ts, method) sys1 d2d(sys, Ts, opts) 说明 sys1 d2d(sys, Ts)将离散时间动态系统模型 sys 重新采样&#…

【精品】Springboot 接收发送日期类型的数据

问题 无法请求到后台&#xff0c;后台报错&#xff1a;[Failed to convert property value of type java.lang.String to required type java.time.LocalDateTime for property &#xff1a; 2023-10-02T09:26:16.06908:00 WARN 14296 --- [p-nio-80-exec-1] .w.s.m.s.Defaul…

【中秋国庆不断更】OpenHarmony组件内状态变量使用:@State装饰器

State装饰的变量&#xff0c;或称为状态变量&#xff0c;一旦变量拥有了状态属性&#xff0c;就和自定义组件的渲染绑定起来。当状态改变时&#xff0c;UI会发生对应的渲染改变。 在状态变量相关装饰器中&#xff0c;State是最基础的&#xff0c;使变量拥有状态属性的装饰器&am…

2021-06-09 51单片机:两个独立按键控制一个led,k1按下松开led闪烁三次,k2按下LED闪烁五次

缘由51单片机:两个独立按键控制一个led,k1按下松开led闪烁三次,k2按下LED闪烁五次_嵌入式-CSDN问答 #include "REG52.h" sbit K1 P1^0; sbit K2 P1^1; sbit LEDP0^0; void main() {unsigned char Xd0,ss0;unsigned int wei0;while(1){if(K10&&Xd0){ss3*2;…

程序调试技巧

多线程调试 有个开关的&#xff0c;在Eclipse里默认开启&#xff0c;在IntelliJ IDEA里默认是没有开启的。也就是说如果你在IDEA里代码里加断点&#xff0c;虽然一个线程的断了下来&#xff0c;但其他线程的已经执行过了。此处把线程的suspend设置成和Eclipse模式一样之后&…

华为云云耀云服务器L实例评测|Elasticsearch的Docker版本的安装和参数设置 端口开放和浏览器访问

前言 最近华为云云耀云服务器L实例上新&#xff0c;也搞了一台来玩&#xff0c;期间遇到各种问题&#xff0c;在解决问题的过程中学到不少和运维相关的知识。 本篇博客介绍Elasticsearch的Docker版本的安装和参数设置&#xff0c;端口开放和浏览器访问。 其他相关的华为云云…

固定式工业RFID读写器有哪些特点?如何选型?

工业读写器可分为便携式读写器和固定式读写器&#xff0c;固定式读写器主要是将读写器固定在某一位置钟&#xff0c;常常应用在工位、生产、进入库等场景中。但是很多人并不了解固定式读写器都有哪些特点&#xff0c;具体应该怎么选型&#xff0c;下面我们就一起来了解一下。 固…

.Net Core后端架构实战【介入IOC控制反转】

引言 Inversion of Control,简称IOC,即控制反转。记得当初刚实习的时候公司的带我的人和我提到过IOC这个概念,当初完全不知道是 啥东西。后来有幸写了半年Java,SpringBoot里面业务开发随处可见IOC。再后来我写.Net Core用到的第一个框架Blog.Core项目,它里 面IRepository与R…

利用DMA的触发循环实现eTMR的PWM周期计数

利用DMA的触发循环实现对eTMR的PWM周期计数 文章目录 利用DMA的触发循环实现对eTMR的PWM周期计数引言分析问题eTMR的调试模式ModulizationFTM的多次重载事件终极大招-使用触发链 解决问题确认DMAMUX中的eTMR相关触发源eTMR产生触发信号 软件总结参考文献 引言 最近在同客户一起…

朝气蓬勃 后生可畏

介绍: 线段树是一棵二叉搜索树,思想与分治很想,把一段区间平分平分再平分,平分到不能平分为止,可以进行方便的区间修改和区间查询,当然,树状数组能做的单点修改、单点查询,线段树也可以更好地实现,总之,线段树是树状数组的升级版,此外,线段树能做的平衡树也能做,但…

Acwing 839. 模拟堆

Acwing 839. 模拟堆 题目描述思路讲解代码展示 题目描述 思路讲解 代码展示 #include <iostream> #include <algorithm> #include <string.h>using namespace std;const int N 100010;int h[N], ph[N], hp[N], cnt;void heap_swap(int a, int b) {swap(ph[…