C++中static关键字的用法(实现日期类)

devtools/2024/10/23 3:56:39/

1.先看概念

静态static_百度百科

static 关键字在 C++ 中有多种用法,主要用于控制变量的存储期和作用域。理解 static 的用法有助于更好地管理内存和程序结构。

2.静态变量

2.1局部静态变量

局部静态变量在函数内部声明,生命周期是整个程序运行期间,但作用域仅限于该函数。

#include <iostream>
using namespace std;void function() {static int count = 0; // 只初始化一次count++;cout << "Count: " << count << endl;
}int main() {for (int i = 0; i < 5; i++) {function();}return 0;
}

2.2全局静态变量

全局静态变量在文件作用域内声明,其他文件无法访问。

#include <iostream>
using namespace std;static int globalVar = 10; // 仅在此文件可见void display() {cout << "Global Variable: " << globalVar << endl;
}int main() {display();return 0;
}

3.静态成员变量

静态成员变量属于类,而不是类的某个对象。它们在所有对象之间共享。

#include <iostream>
using namespace std;class MyClass {
public:static int count; // 声明静态成员变量MyClass() {count++;}
};// 定义静态成员变量
int MyClass::count = 0;int main() {MyClass obj1;MyClass obj2;cout << "Count of objects: " << MyClass::count << endl; // 输出: 2return 0;
}

4.静态成员函数

静态成员函数可以访问静态成员变量,但不能访问非静态成员变量和函数。

#include <iostream>
using namespace std;class MyClass {
public:static int count; // 静态成员变量static void displayCount() {cout << "Count: " << count << endl;}
};int MyClass::count = 5;int main() {MyClass::displayCount(); // 输出: Count: 5return 0;
}

5.静态访问

使用 static 声明的全局变量和函数只在声明它们的文件中可见,这称为静态链接。可以防止名称冲突。

// file1.cpp
#include <iostream>
using namespace std;static void staticFunction() {cout << "This is a static function in file1." << endl;
}// file2.cpp
#include <iostream>
using namespace std;// staticFunction() 在此文件不可见int main() {// staticFunction(); // 会报错return 0;
}

6.用static实现日期类

6.1静态方法的使用

在上述代码中,我们定义了两个静态方法:

  • getCurrentDate()返回一个固定的当前日期。

  • isLeapYear(int year)判断给定年份是否为闰年。

6.2日期类的定义

  • #include <iostream>
    #include <string>class Date {
    private:int day;int month;int year;public:// 构造函数Date(int d, int m, int y) : day(d), month(m), year(y) {}// 获取日期字符串std::string getDateString() const {return std::to_string(day) + "/" + std::to_string(month) + "/" + std::to_string(year);}// 静态方法: 获取当前日期(假设为固定日期)static Date getCurrentDate() {return Date(19, 10, 2024); // 这里返回的是一个固定的日期}// 静态方法: 判断是否是闰年static bool isLeapYear(int year) {return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);}
    };

6.3 主函数示例

int main() {// 创建一个日期对象Date date(1, 1, 2023);std::cout << "日期: " << date.getDateString() << std::endl;// 使用静态方法获取当前日期Date currentDate = Date::getCurrentDate();std::cout << "当前日期: " << currentDate.getDateString() << std::endl;// 检查年份是否为闰年int yearToCheck = 2024;if (Date::isLeapYear(yearToCheck)) {std::cout << yearToCheck << " 是闰年。" << std::endl;} else {std::cout << yearToCheck << " 不是闰年。" << std::endl;}return 0;
}

代码解释

  1. Date 类

    • 包含三个私有成员变量 daymonth year

    • 构造函数初始化这些变量。

    • getDateString() 方法返回日期的字符串格式。

    • getCurrentDate() 静态方法返回一个固定日期的 Date 对象。

    • isLeapYear() 静态方法判断给定年份是否为闰年。

  2. main 函数

    • 创建一个 Date 对象并输出其日期。

    • 调用静态方法 getCurrentDate() 获取当前日期并输出。

    • 调用 isLeapYear() 方法判断指定年份是否为闰年。

6.4总代码与结构

#include <iostream>
#include <string>class Date {
private:int day;int month;int year;public:// 构造函数Date(int d, int m, int y) : day(d), month(m), year(y) {}// 获取日期字符串std::string getDateString() const {return std::to_string(day) + "/" + std::to_string(month) + "/" + std::to_string(year);}// 静态方法: 获取当前日期(假设为固定日期)static Date getCurrentDate() {return Date(19, 10, 2024); // 这里返回的是一个固定的日期}// 静态方法: 判断是否是闰年static bool isLeapYear(int year) {return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);}
};
int main() {// 创建一个日期对象Date date(1, 1, 2023);std::cout << "日期: " << date.getDateString() << std::endl;// 使用静态方法获取当前日期Date currentDate = Date::getCurrentDate();std::cout << "当前日期: " << currentDate.getDateString() << std::endl;// 检查年份是否为闰年int yearToCheck = 2024;if (Date::isLeapYear(yearToCheck)) {std::cout << yearToCheck << " 是闰年。" << std::endl;}else {std::cout << yearToCheck << " 不是闰年。" << std::endl;}return 0;
}

7.总结

static 关键字在 C++ 中具有多种用法,主要用于控制变量的生命周期和作用域。通过合理使用 static,可以提高程序的效率和安全性。 


http://www.ppmy.cn/devtools/128044.html

相关文章

软考——计算机网络概论

文章目录 &#x1f550;计算机网络分类1️⃣通信子网和资源子网2️⃣网络拓扑结构3️⃣ 计算机网络分类3&#xff1a;LAN MAN WAN4️⃣其他分类方式 &#x1f551;OSI 和 TCP/IP 参考模型1️⃣OSI2️⃣TCP/IP&#x1f534;TCP/IP 参考模型对应协议 3️⃣OSI 和 TCP/IP 模型对应…

Java项目-基于Springboot的应急救援物资管理系统项目(源码+说明).zip

作者&#xff1a;计算机学长阿伟 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、ElementUI等&#xff0c;“文末源码”。 开发运行环境 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringBoot、Vue、Mybaits Plus、ELementUI工具&#xff1a;IDEA/…

十七、Python基础语法(list(列表)-下)

一、列表反转/逆置 方法一&#xff1a;直接修改原列表&#xff1a;列表.reverse() 方法二&#xff1a;使用切片&#xff0c;不会修改原列表&#xff0c;会得到一个新的列表&#xff1a;列表[::-1] my_list [0, 1, 2, 3, 4, 5, 6]# 直接修改原列表&#xff1a;列表.reverse(…

win10系统.net framework 3.5sp1组件怎么开启?

win10系统.net framework 3.5sp1组件怎么开启&#xff1f; 在 Windows 10 系统中启用 .NET Framework 3.5 SP1&#xff0c;可以按照以下步骤操作&#xff1a; 一、通过控制面板启用&#xff1a; 打开“控制面板”。 选择“程序”类别。 点击“启用或关闭 Windows 功能”。 …

【Kuberntes】k8s权限管理

文章目录 权限管理概述核心概念配置RBAC创建Role和ClusterRole创建RoleBinding和ClusterRoleBinding 默认角色和角色绑定权限的实现注意事项 如何在 Kubernetes 中实现 RBAC 的细粒度权限控制&#xff1f;1. Role和ClusterRole2. RoleBinding和ClusterRoleBinding3. 配置RBAC4.…

Canvas 在前端中的高级应用

一、引言 在前端开发领域&#xff0c;HTML5 的 <canvas> 元素为网页带来了强大的绘图和动画功能。它不仅可以用于绘制简单的图形&#xff0c;还能够实现复杂的交互效果和动画场景。以下将详细介绍 canvas 的使用方法&#xff0c;并展示一些高级案例。 二、Canvas 基础 …

Android15之解决gdb:Remote register badly formatted问题(二百三十六)

简介&#xff1a; CSDN博客专家、《Android系统多媒体进阶实战》一书作者 新书发布&#xff1a;《Android系统多媒体进阶实战》&#x1f680; 优质专栏&#xff1a; Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a; 多媒体系统工程师系列【…

【Flutter】Dart:类

在 Dart 中&#xff0c;类&#xff08;Class&#xff09;是面向对象编程的核心概念之一&#xff0c;提供了一种封装数据和功能的方式。理解 Dart 中的类以及它的相关特性是开发 Flutter 应用的基础。本教程将深入介绍 Dart 中类的定义、属性、构造函数、方法、接口、Mixin 以及…