c/c++--静态变量和静态函数(static)

目录

1 c++静态函数和静态变量

1.1 C++静态成员函数:

1.1.1定义与基本语法

1.1.2 不依赖于实例

1.1.3 访问限制

1.1.4共享数据

1.1.5 作用域与命名

1.1.6 工厂函数和工厂方法(常用途)

​​​1.2 c++静态函数()

1.3c++静态变量

2 c语言静态变量:

2.1 静态局部变量和静态全局变量:

2.2 静态函数


1 c++静态函数和静态变量

1.1 C++静态成员函数:

1.1.1定义与基本语法

在C++中,使用 static 关键字定义静态成员函数。静态函数的定义如下:

class MyClass { public: static void myStaticFunction() { // 函数体 } };

1.1.2 不依赖于实例

静态函数不需要类的实例就可以被调用。这意味着你可以在没有创建对象的情况下直接通过类名调用它。这在需要执行与具体对象无关的操作时非常有用。


MyClass::myStaticFunction(); // 直接通过类名调用

1.1.3 访问限制

静态函数只能访问静态成员变量和其他静态成员函数,不能访问实例成员(非静态成员)。这是因为静态函数的上下文并不与任何具体实例关联。

class MyClass {
public:static int staticVar;int instanceVar;static void myStaticFunction() {staticVar = 10;      // 可以访问静态成员// instanceVar = 5;  // 错误,无法访问实例成员}
};

1.1.4共享数据

由于静态成员函数和静态成员变量属于类本身,而不是某个特定对象,所以它们可以在所有对象之间共享。这意味着所有对象共享同一个静态变量的值。

class MyClass {
public:static int count;MyClass() {count++;}static void printCount() {std::cout << "Count: " << count << std::endl;}
};int MyClass::count = 0;  // 静态变量初始化int main() {MyClass obj1;MyClass obj2;MyClass::printCount();  // 输出 Count: 2
}

1.1.5 作用域与命名

静态函数的作用域一般限于定义它的类,但可以通过类名进行访问。这使得它可以明确地标识出调用的是哪个类的静态函数,避免命名冲突。

1.1.6 工厂函数和工厂方法(常用途)

  • 工具函数静态函数常用于实现不依赖于实例的工具函数,比如数学计算等。
  • 工具函数:在 MathUtil 类中,静态函数 squareRoot 和 power 用于执行数学计算,无需创建类的实例。

工具函数实例:

#include <iostream>
#include <cmath>class MathUtil {
public:// 静态函数:计算平方根static double squareRoot(double number) {return std::sqrt(number); // 返回平方根}// 静态函数:计算幂static double power(double base, double exponent) {return std::pow(base, exponent); // 返回 base 的 exponent 次方}
};int main() {double sqrtValue = MathUtil::squareRoot(16.0); // 计算 16 的平方根double powerValue = MathUtil::power(2.0, 3.0);  // 计算 2 的 3 次方std::cout << "Square root of 16: " << sqrtValue << std::endl; // 输出 4std::cout << "2 raised to the power of 3: " << powerValue << std::endl; // 输出 8return 0;
}
  • 工厂方法:静态成员函数可以用作工厂方法,用于创建类的实例并返回
  • 工厂方法:在 Circle 类中,静态成员函数 createCircle 用于创建 Circle 实例,构造函数被私有化以防止直接实例化,确保通过工厂方法来控制实例的创建。

工厂方法实例:

#include <iostream>class Circle {
private:double radius;// 构造函数私有化,防止外部直接创建实例Circle(double r) : radius(r) {}public:// 静态工厂方法:创建 Circle 实例static Circle createCircle(double r) {return Circle(r); // 返回 Circle 实例}double area() const {return 3.14159 * radius * radius; // 计算圆的面积}
};int main() {// 使用工厂方法创建 Circle 实例Circle circle = Circle::createCircle(5.0); // 创建半径为5的圆std::cout << "Area of the circle: " << circle.area() << std::endl; // 输出圆的面积return 0;
}

​​​1.2 c++静态函数()

1.3c++静态变量

  1. 静态成员变量

    • C++中可以在类中定义静态成员变量,这些变量属于类而不是某个实例。

    • 所有实例共享同一个静态成员变量。

  2. 静态局部变量

    • 和C语言中的静态局部变量类似,静态局部变量在函数中定义后,只会初始化一次,并在函数调用结束后保留其值。

#include <iostream>class MyClass {
public:static int count; // 静态成员变量MyClass() {count++;}static void printCount() {std::cout << "Count: " << count << std::endl;}
};int MyClass::count = 0; // 静态变量初始化int main() {MyClass obj1;MyClass obj2;MyClass::printCount(); // 输出 Count: 2return 0;
}

2 c语言静态变量:

2.1 静态局部变量和静态全局变量:

C 语言中,使用 static 修饰一个全局变量会将其作用域限制在定义它的文件内。也就是说,其他文件无法访问这个变量,

如果使用 static 修饰一个局部变量,主要有以下几个作用:

  1. 静态存储期:局部变量会在程序开始时分配内存,并在整个程序运行期间保持该内存的有效性,而不是在每次进入该函数时分配和释放。这意味着该变量的生命周期延续至程序结束。

  2. 保持值:每次调用该函数时,静态局部变量不会被重新初始化,而是保持上一次函数调用结束时的值。这使得它可以用于在多次函数调用之间保留状态。

  3. 作用域:静态局部变量的作用域仍然局限于定义它的函数内,外部无法直接访问。

#include <stdio.h>void counter() {static int count = 0; // 静态局部变量count++;printf("Count: %d\n", count);
}int main() {counter(); // 输出: Count: 1counter(); // 输出: Count: 2counter(); // 输出: Count: 3return 0;
}

在这个例子中,count 是一个静态局部变量,它在每次调用 counter() 时保持其值。

2.2 静态函数

限制作用域静态函数的作用域仅限于定义它的源文件。这意味着其他文件无法调用这个函数,有助于避免命名冲突。

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

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

相关文章

2024年好用不踩雷的8款图纸加密软件推荐!CAD图纸加密软件!

在2024年&#xff0c;随着信息安全需求的提升&#xff0c;特别是对于设计、建筑、制造等行业的CAD图纸保护&#xff0c;图纸加密软件的选择尤为重要。以下推荐了8款优质的CAD图纸加密软件&#xff0c;这些软件不仅提供了强大的加密功能&#xff0c;还在易用性和兼容性方面表现出…

创新业态下金融头部机构在 FICC 平台建设上的思考与实践

近年来&#xff0c;FICC 投资交易呈现活跃多元态势&#xff0c;创新转型稳步推进。FICC 平台电子化方兴未艾&#xff0c;是机构提升服务效率和质量的一大着力点。因此&#xff0c;在 FICC 平台建设上&#xff0c;许多机构都进行了深入研究&#xff0c;积累了丰富的实践经验。 …

MongoDB快速入门

MongoDB 概念 什么是 MongoDB MongoDB 是在2007年由DoubleClick公司的几位核心成员开发出的一款分布式文档数据库&#xff0c;由C语言编写。 目的是为了解决数据大量增长的时候系统的可扩展性和敏捷性。MongoDB要比传统的关系型数据库简单很多。 在MongoDB中数据主要的组织…

Spring boot 配置文件的加载顺序

Spring Boot 在启动时会扫描以下位置的 application.properties 或者 application.yml 文件作为全局配置文件&#xff1a; –file:./config/–file:./–classpath:/config/–classpath:/以下是按照优先级从高到低的顺序&#xff0c;如下所示&#xff1a; Spring Boot 会全部扫…

医院信息化与智能化系统(10)

医院信息化与智能化系统(10) 这里只描述对应过程&#xff0c;和可能遇到的问题及解决办法以及对应的参考链接&#xff0c;并不会直接每一步详细配置 如果你想通过文字描述或代码画流程图&#xff0c;可以试试PlantUML&#xff0c;告诉GPT你的文件结构&#xff0c;让他给你对应…

自由学习记录(15)

Java注解 else if的省略问题&#xff08;可能看花&#xff09; else if也是取最近的if连通&#xff0c;看上去加了{}就可以正常执行了&#xff0c;缩进要命&#xff0c;不提示真容易看错&#xff0c; 组合数公式和数组参数 在 C 中&#xff0c;数组作为函数参数时&#xff0c;…

【课件分享】蓝光光盘及光驱团标解读

关注我们 - 数字罗塞塔计划 - 10月26日&#xff0c;非常感谢陶光毅老师携特邀嘉宾许斌老师和游泳总能够在百忙之中抽空莅临数字罗塞塔计划直播间&#xff0c;为大家带来蓝光光盘及光驱团标解读。作为标准的起草者&#xff0c;你们的专业见解和宝贵经验&#xff0c;让我们对T/CE…

Lucas带你手撕机器学习——SVM支持向量机

#1024程序员节&#xff5c;征文# 支持向量机&#xff08;SVM&#xff09;的详细讲解 什么是SVM&#xff1f; 支持向量机&#xff08;Support Vector Machine&#xff0c;SVM&#xff09;是一种用于分类和回归的监督学习算法。它的主要任务是从给定的数据中找到一个最佳的决策…

Windows/Linux(服务器)查看显卡的名称

文章目录 1. 使用 nvidia-smi&#xff08;适用于 NVIDIA 显卡&#xff09;2. 使用 wmic 命令&#xff08;Windows&#xff09; 1. 使用 nvidia-smi&#xff08;适用于 NVIDIA 显卡&#xff09; 如果服务器上安装了 NVIDIA 驱动程序&#xff0c;可以使用 nvidia-smi 工具来查看…

vue使用xlsx以及file-saver进行下载xlsx文件以及Unit8Array、ArrayBuffer、charCodeAt的使用

先说Unit8Array、ArrayBuffer、charCodeAt的使用下面会用到这三个 Unit8Array&#xff1a;数组类型表示一个 8 位无符号整型数组&#xff0c;创建时内容被初始化为 0。创建完后&#xff0c;可以以对象的方式或使用数组下标索引的方式引用数组中的元素。 new Uint8Array(); //…

Docker中如何控制服务启动顺序实现探讨

文章目录 一、Docker概述二、Docker三剑客1. Compose2. Machine3. Swarm 三、简要需求1. 样例工程2. 代码模块3. 调用方向4. 期望启动顺序 四、思路分析1.各走各路1.&#xff09;docker-compose -f指定不同配置文件2.&#xff09;docker-compose up -d service-name指定服务名3…

【CSS in Depth 2 精译_055】8.3 伪类 :is() 和 :where() 的正确打开方式

当前内容所在位置&#xff08;可进入专栏查看其他译好的章节内容&#xff09; 【第三部分 现代 CSS 代码组织】 ✔️【第八章 层叠图层及其嵌套】 ✔️ 8.1 用 layer 图层来操控层叠规则&#xff08;上篇&#xff09; 8.1.1 图层的定义&#xff08;上篇&#xff09;8.1.2 图层的…

巡飞单机多旋翼无人机技术详解

巡飞单机多旋翼无人机技术是一种集成了多种先进技术的无人机系统&#xff0c;它具备自主飞行、长续航、高精度控制以及多任务负载能力等特点。以下是对巡飞单机多旋翼无人机技术的详细解析&#xff1a; 一、机架与结构设计 1.材料选择&#xff1a;为了确保无人机能够承载足够…

cmake命令使用

有关cmake的入门简介可参见 CMake入门教程_cmake静态test.c编译-CSDN博客 本文是进一步对cmake常用命令做进一步详述 配置项目 cmake_minimum_required 作用 配置cmake最低版本 用法 cmake_minimum_required(VERSION 3.0) project 作用&#xff1a;设置预设变量 PROJEC…

深度学习(一)基础:神经网络、训练过程与激活函数(1/10)

深度学习基础&#xff1a;神经网络、训练过程与激活函数 引言&#xff1a; 深度学习作为机器学习的一个子领域&#xff0c;近年来在人工智能的发展中扮演了举足轻重的角色。它通过模仿人脑的神经网络结构&#xff0c;使得计算机能够从数据中学习复杂的模式和特征&#xff0c;…

dmsql日志分析工具部署与使用DM8/DM7

dmsql日志分析工具部署与使用DM8/DM7 1 环境介绍2 JAVA 环境变量配置2.1 Os Kylin 10 JAVA 环境变量配置2.2 Windos7 JAVA环境变量配置 3 数据库配置3.1 数据库初始化参数3.2 数据库创建表 4 配置DMLOG日志分析工具4.1 Kylin v10 配置DMLOG日志分析工具4.2 执行日志分析4.3 Win…

linux面试题复习

前言 现在只是初版&#xff0c;很多格式我还没有改好&#xff0c;会慢慢修改订正。 可能用到的网址&#xff1a;在线 EXCEL 到 MARKDOWN 转换器。 参考了很多网上的面试题和外网上的面试题&#xff1a; 参考文档&#xff1a; 程序员的50大Linux面试问题及答案 Top 60 Linux …

MySQL——test4(综合练习)

目录 建库建表&#xff08;题目&#xff09;处理表1. 修改student 表中年龄(sage)字段属性&#xff0c;数据类型由int 改变为smallint2. 为Course表中Cno 课程号字段设置索引,并查看索引3. 为SC表建立按学号(sno)和课程号(cno)组合的升序的主键索引&#xff0c;索引名为SC_INDE…

数据结构:“小猫钓鱼游戏”

一&#xff1a;题目 栈和队列的综合应用&#xff1a;“小猫钓鱼”的游戏规则是&#xff1a;将一副扑克牌平均分成两份&#xff0c;每人拿一份。玩家甲先拿出手中的第一张扑克牌放在桌上&#xff0c;然后玩家乙也拿出手中的第一张扑克牌&#xff0c;并放在玩家甲刚打出的扑克牌的…

前端算法:树(力扣144、94、145、100、104题)

目录 一、树&#xff08;Tree&#xff09; 1.介绍 2.特点 3.基本术语 4.种类 二、树之操作 1.遍历 前序遍历&#xff08;Pre-order Traversal&#xff09;&#xff1a;访问根节点 -> 遍历左子树 -> 遍历右子树。 中序遍历&#xff08;In-order Traversal&#xf…