静态函数(static)-> static 与 const

news2024/9/25 12:20:56

一.静态函数

静态函数(Static Function)是指在C++中使用static关键字声明的函数。它们与普通成员函数和全局函数不同,具有以下特点:

  1. 作用域限制:静态函数在类的作用域内,但它们不依赖于类的实例,因此可以被类的名称直接调用,而不需要创建类的对象。

  2. 无法访问非静态成员:静态函数不能访问类的非静态成员变量或非静态成员函数,因为它们不与类的任何特定实例相关联。只能访问类的静态成员变量和其他静态函数。

  3. 与类相关:静态函数通常与类的实现相关,而不是与类的实例状态相关。它们可以用于执行与类的数据或功能相关的操作,而不需要访问特定的对象。

  4. 不需要实例化:与普通成员函数不同,静态函数可以直接通过类的名称来调用,而无需创建类的对象实例。

  5. 用途:静态函数通常用于实现与类相关的全局功能或工具函数,而不需要类的实例。它们也可以用于管理类的静态成员变量。

下面是一个简单示例,演示了如何声明和使用静态函数:

class MyClass {
public:
    static int staticFunction(int x, int y) {
        return x + y;
    }

    static int staticVariable;
};

int MyClass::staticVariable = 42; // 静态成员变量的定义和初始化

int main() {
    int result = MyClass::staticFunction(10, 20); // 直接通过类名调用静态函数
    std::cout << "Result: " << result << std::endl;

    std::cout << "Static Variable: " << MyClass::staticVariable << std::endl;

    return 0;
}

在上面的示例中,staticFunction是一个静态函数,可以通过MyClass::staticFunction的方式调用。同时,MyClass::staticVariable是一个静态成员变量,可以通过类名访问。这两者都不需要创建MyClass的对象实例。

二.static 关键字

在C++中,关键字 static 有多种用法,它可以用于不同的上下文中,具体取决于它所修饰的对象或变量。以下是一些常见的用法:

1.静态变量 (Static Variables): 在函数内部或全局作用域中声明的静态变量在程序的整个生命周期内保持其值。与普通局部变量不同,静态变量只会在首次进入其作用域时初始化一次。例如:

#include <iostream>

void foo() {
    static int count = 0; // 静态局部变量
    count++;
    std::cout << "Count: " << count << std::endl;
}

int main() {
    foo();
    foo();
    return 0;
}

2. 静态函数 (Static Functions): 静态函数是与类相关联而不是与类的实例相关联的成员函数。它们可以通过类名直接调用,而不需要创建类的对象。通常用于实用函数或不需要访问实例数据的函数。

class MyClass {
public:
    static void staticFunction() {
        std::cout << "This is a static function." << std::endl;
    }
};

int main() {
    MyClass::staticFunction(); // 直接调用静态函数
    return 0;
}

3.静态类成员 (Static Class Members): 类中的静态成员是类的所有实例共享的成员,而不是每个实例拥有自己的副本。它们可以用于在多个实例之间共享数据或功能。

class MyClass {
public:
    static int staticVar; // 静态成员变量
};

int MyClass::staticVar = 42; // 初始化静态成员变量

int main() {
    MyClass obj1;
    MyClass obj2;

    obj1.staticVar = 10;
    std::cout << "obj1.staticVar: " << obj1.staticVar << std::endl;
    std::cout << "obj2.staticVar: " << obj2.staticVar << std::endl;

    return 0;
}

4.静态类 (Static Classes): 在C++中,可以将类声明为静态类,这意味着无法创建该类的实例,通常用于包含静态成员和静态函数的类。

class StaticClass {
public:
    static void staticFunction() {
        std::cout << "This is a static function in a static class." << std::endl;
    }
};

int main() {
    // 无法创建StaticClass的实例
    // StaticClass myObj; // 这将导致编译错误

    StaticClass::staticFunction(); // 直接调用静态函数
    return 0;
}

 

三.const 关键字

在C++中,const 是一个关键字,用于声明常量或表明某些东西是不可修改的。const 可以应用于不同的上下文,包括变量、函数参数和成员函数。以下是关于C++中的 const 的一些常见用法:

1.常量变量 (Constant Variables): 使用 const 关键字声明的变量是常量,它们的值在初始化后不能被修改。

const int myConstVar = 10;
// myConstVar = 20; // 这将导致编译错误,常量不能被修改

2.指向常量的指针 (Pointers to Constants): 使用 const 修饰指针,可以创建指向常量的指针,这意味着通过该指针不能修改指向的值。

const int myConstVar = 10;
const int* ptr = &myConstVar;
// *ptr = 20; // 这将导致编译错误,通过 ptr 不能修改 myConstVar 的值

 

 3.常量指针 (Constant Pointers): 使用 const 修饰指针变量本身,可以创建一个常量指针,这意味着该指针不能指向其他变量,但可以用来修改指向的值。

int myVar = 10;
int* const ptr = &myVar;
*ptr = 20; // 有效,可以修改 myVar 的值
// ptr = nullptr; // 这将导致编译错误,不能修改 ptr 指向其他地址

4.常量成员函数 (Constant Member Functions): 在类中的成员函数前面加上 const 关键字,表示该函数不会修改对象的状态。它可以被用于常量对象上。

class MyClass {
public:
    void normalFunction() {
        // 可以修改对象的成员变量
    }

    void constFunction() const {
        // 不能修改对象的成员变量
    }
};

const MyClass constObj;
constObj.normalFunction(); // 这将导致编译错误
constObj.constFunction();  // 可以调用 const 成员函数

 

5.常引用 (Constant References): 使用 const 修饰引用,可以创建常量引用,这意味着通过该引用不能修改引用的值。

int myVar = 10;
const int& myConstRef = myVar;
// myConstRef = 20; // 这将导致编译错误,不能通过 myConstRef 修改 myVar 的值

6.常量函数参数 (Constant Function Parameters): 在函数参数中使用 const 关键字,表示该参数是常量,函数内部不能修改它的值。

void myFunction(const int x) {
    // x = 20; // 这将导致编译错误,x 是常量
}

 

四.static 和 const 的区别

在C++中,staticconst 都是关键字,但它们用于不同的目的,具有不同的作用。以下是它们之间的主要区别:

  1. 作用领域:

    • static 通常用于控制存储持续性(存储期)和作用域。它可以用于变量、函数、类成员、类本身等,用于控制它们的生命周期和可见性。
    • const 用于声明常量或表示某些东西是不可修改的。它可以应用于变量、函数参数、成员函数等,用于指定不可更改的值或状态。
  2. 存储期:

    • static 与存储期相关,它可以使变量成为静态存储期(在程序生命周期内存在)或限制变量的作用域(在某个范围内可见)。
    • const 与存储期无关,它只是指示一个值是常量,无论其存储期如何。
  3. 可修改性:

    • static 关键字本身不表示可修改性。它主要用于控制变量的生命周期和作用域,而不是变量本身的可修改性。
    • const 关键字用于表示值是不可修改的。如果你将其应用于变量,那么该变量的值不能被更改。如果你将其应用于函数参数,那么函数不能修改参数的值。
  4. 示例:

  • 使用 static 的示例:
  • static int counter = 0; // 静态变量,存储期在整个程序生命周期内
    void foo() {
        static int localVar = 0; // 静态局部变量,作用域在函数内,但存储期在整个程序生命周期内
    }

  •  使用 const 的示例:
  • const int myConstVar = 10; // 常量变量,值不能被修改
    void myFunction(const int x) { // 常量函数参数,参数值不能被修改
        // x = 20; // 这将导致编译错误,x 是常量
    }

    总结来说,static 用于控制存储期和作用域,而 const 用于表示不可修改的值或状态。它们在C++中有不同的用途,但可以一起使用,例如声明静态常量或静态成员函数,以实现各种编程需求。

 

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

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

相关文章

GIF动态表情如何制作?教你一招超简单的gif制作方法

动态gif表情包是如何制作的&#xff1f;gif格式动图作为网络上流行的一种图片格式&#xff0c;可以将多张静态图片变成一张gif动图&#xff0c;能够以生动有趣的方式传递信息。而且制作这种gif动图的方法也非常的简单&#xff0c;只需要使用gif在线制作&#xff08;https://www…

不就是G2O嘛

从零开始一起学习SLAM | 理解图优化&#xff0c;一步步带你看懂g2o代码 SLAM的后端一般分为两种处理方法&#xff0c;一种是以扩展卡尔曼滤波&#xff08;EKF&#xff09;为代表的滤波方法&#xff0c;一种是以图优化为代表的非线性优化方法。不过&#xff0c;目前SLAM研究的主…

Oracle数据库开发者工具

和开发者相关的数据库特性&#xff0c;功能与工具列举如下&#xff0c;但不限于以下。因为Oracle数据库中的许多功能其实都间接的和开发者发生关系&#xff0c;如Oracle高级安全选件中的透明数据加密&#xff0c;数据编辑。Oracle Spatial and Graph&#xff08;地理空间与图&a…

ansible搭建

一&#xff0c;ansible是一种由Python开发的自动化运维工具&#xff0c;集合了众多运维工具&#xff08;puppet、cfengine、chef、func、fabric&#xff09;的优点&#xff0c;实现了批量系统配置、批量程序部署、批量运行命令等功能 二&#xff0c;特点 * 部署简单 * **默认…

数据结构入门-13-图

文章目录 一、图的概述1.1 图论的作用1.2 图的分类1.2.1 无向图1.2.2 有向图1.2.3 无权图1.2.4 有劝图 1.3 图的基本概念 二、树的基本表示2.1 邻接矩阵2.1.1 邻接矩阵 表示图2.1.2 邻接矩阵的复杂度 2.2 邻接表2.2.1 邻接表的复杂度2.2.2 邻接表By哈希表 三、图的深度优先遍历…

LLM文章阅读:Baichuan 2 干货

如有转载&#xff0c;请注明出处。欢迎关注微信公众号&#xff1a;低调奋进。打算开始写LLM系列文章&#xff0c;主要从数据、训练框架、对齐等方面进行LLM整理。 Baichuan 2: Open Large-scale Language Models 原始文章链接 https://cdn.baichuan-ai.com/paper/Baichuan2-…

Element Plus table formatter函数返回html内容

查看 Element Plus table formatter 支持返回 类型为string 和 VNode对象&#xff1b; 若依全局直接用h函数&#xff0c;无需引用 下面普通基本用法&#xff1a;在Element Plus中&#xff0c;你可以使用自定义的formatter函数来返回VNode对象&#xff0c;从而实现更灵活的自定…

FasterNet(PConv)paper笔记(CVPR2023)

论文&#xff1a;Run, Don’t Walk: Chasing Higher FLOPS for Faster Neural Networks 先熟悉两个概念&#xff1a;FLOPS和FLOPs&#xff08;s一个大写一个小写&#xff09; FLOPS: FLoating point Operations Per Second的缩写&#xff0c;即每秒浮点运算次数&#xff0c;或…

Pytorch实现鸟类品种分类识别(含训练代码和鸟类数据集)

Pytorch实现鸟类品种分类识别(含训练代码和鸟类数据集) 目录 Pytorch实现鸟类品种分类识别(含训练代码和鸟类数据集) 1. 前言 2. 鸟类数据集 &#xff08;1&#xff09;Bird-Dataset26 &#xff08;2&#xff09;自定义数据集 3. 鸟类分类识别模型训练 &#xff08;1&a…

核心实验13合集_vlan mapping 和QinQ_ENSP

项目场景一&#xff1a; 核心实验13合集-1_vlan高级配置_ENSP vlan mapping vlan转换 将用户端发来的vlan30-31的标签全部转换成vlan100向上发送 相关知识点&#xff1a; 定义: VLAN Mapping通过修改报文携带的VLAN Tag来实现不同VLAN的相互映 射。 目的: 在某些场景中&#xf…

c语言数组的用法

c语言数组的用法如下&#xff1a; 一维数组的定义方式 在C语言中使用数组必须先进行定义。一维数组的定义方式为&#xff1a; 类型说明符 数组名 [常量表达式]; 其中&#xff0c;类型说明符是任一种基本数据类型或构造数据类型。数组名是用户定义的数组标识符。方括号中的常量表…

原生js之dom表单改变和鼠标常用事件

那么好,本次我们聊聊表单改变时如何利用onchange方法来触发input改变事件以及鼠标常用的滑入滑出,点击down和点击up事件. 关于onchange方法 onchange方法在鼠标输入完后点击任何非输入框位置时触发.触发时即可改变原有输入框的值. out 、leave、over、down、up鼠标方法 当用…

YOLOV7改进-空洞卷积+共享权重的Scale-Aware RFE

代码 1、先把文件复制到common.py中 2、yolo.py添加类名 3、下半部分进行添加修改 4、cfg-training&#xff1a;新建配置文件 加了一行&#xff0c;后面对于序号1 5、这里选择12层替代

软件第三方测评机构简析:良好的测试环境对软件产品起到的作用

近年来&#xff0c;软件行业发展迅速&#xff0c;软件产品的质量成为用户关注的焦点。而软件的质量评估往往需要依赖专业的第三方测评机构&#xff0c;为了更好地了解软件测试环境对产品质量的重要性&#xff0c;小编整理了以下简析&#xff1a; 一、良好的测试环境对软件产品…

Redis是单线程Or多线程?单线程为什么反而快?

0. 从什么角度看是单线程or多线程 从总体角度来&#xff0c;redis是单线程的&#xff1a; Redis 单线程指的是&#xff1a; 「接收客户端请求->解析请求 ->进行数据读写等操作->发送数据给客户端」 这个过程是由一个线程&#xff08;主线程&#xff09;来完成的…

【Leetcode刷题】哈希

本篇文章为 LeetCode 哈希模块的刷题笔记&#xff0c;仅供参考。 哈希表是一种使用哈希函数组织数据&#xff0c;以支持快速插入和搜索的数据结构。哈希表通过哈希函数通过将任意类型的数据映射到固定大小的数据&#xff0c;以实现快速查找和存储数据。C 中的无序容器 unorder…

音视频编码格式-AAC ADT

1408(16进制) : 0001 0100 0000 1000 audioObjectType为 00010 , 即 2&#xff0c; profie (audioObjectType -1 ) AAC LC samplingFrequencyIndex为 1000 , 即 8 , 对应的采样频率为 16000 channelConfiguration为 0001 , 表示channel数量为1

10、哈希函数与哈希表

哈希函数 出现次数最多的 32G 小文件方法&#xff1a;利用哈希函数在种类上均分 设计RandomPool结构 设计一种结构&#xff0c;在该结构中有如下三个功能: insert(key):将某个key加入到该结构&#xff0c;做到不重复加入 delete(key):将原本在结构中的某个key移除 getRando…

电商3D资产优化管线的自动化

如果你曾经尝试将从 CAD 程序导出的 3D 模型上传到 WebGL 或 AR 服务&#xff0c;那么可能会遇到最大文件大小、永无休止的进度条和糟糕的帧速率等问题。 为了创作良好的在线交互体验&#xff0c;优化 3D 数据的大小和性能至关重要。 这也有利于你的盈利&#xff0c;因为较小的…

识别评估项目风险常用6大方法

提前识别和评估项目风险&#xff0c;有助于风险预防和规避&#xff0c;从而提前采取预防措施&#xff0c;有效避免和减少风险的发生&#xff0c;防止风险进一步扩大和恶化。如果没有提前识别风险&#xff0c;没有及时处理风险问题&#xff0c;往往造成项目交付延迟、成本超支等…