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

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.lryc.cn/news/470427.html

相关文章:

  • Windows系统启动MongoDB报错无法连接服务器
  • Linux的makefile与进度条小程序实践
  • latex写作基础
  • Chromium HTML5 新的 Input 类型email对应c++
  • 嵌入式Linux的AXI平台(platform)驱动教程
  • 什么是Java策略模式?与Spring的完美结合
  • [Go实战]:HTTP请求转发
  • 【C++单调栈 贡献法】907. 子数组的最小值之和|1975
  • 极狐GitLab 17.5 发布 20+ 与 DevSecOps 相关的功能【二】
  • Django 5 增删改查 小练习
  • 【STM32 Blue Pill编程实例】-I2C主从机通信(中断、DMA)
  • 基于SSM+小程序的旅游社交登录管理系统(旅游4)
  • 高级java每日一道面试题-2024年10月24日-JVM篇-说一下JVM有哪些垃圾回收器?
  • Java-内部类
  • flutter集成极光推送
  • D. Skipping 【 Codeforces Round 980 (Div. 2)】
  • 【golang】学习文档整理
  • 动态规划-子序列问题——1218.最长定差子序列
  • 双子塔楼宇可视化系统:提升建筑管理与运营效率
  • 32位的ARMlinux的4字节变量原子访问问题
  • 用哪种建站程序做谷歌SEO更容易?
  • IPsec简单介绍
  • 颠覆级AI:10秒生成超清视频
  • 《西安科技大学学报》
  • redis详细教程(2.List教程)
  • 电子电气架构 --- 电气系统工程
  • 15-4连续子串和的整除问题
  • Spring源码:Bean创建、Bean获取
  • MetaArena推出《Final Glory》:引领Web3游戏技术新风向
  • 玩转Shodan:深度挖掘特定漏洞与脆弱资产的实战技巧