C++的static、this和final关键字介绍

C++的static、this和final关键字介绍

☆static关键字:static可以用于不同的上下文,其主要作用如下:

在类中,static成员表示类的静态成员,即属于整个类而不是类的实例。静态成员可以被所有该类的对象所共享,且不依赖于特定的对象。静态成员变量存储在数据段,静态成员函数不依赖于实例,可以直接通过类名调用。

在函数内部,static局部变量或函数表示在函数执行期间只初始化一次,并在多次调用之间保持其值。

在全局或命名空间作用域中,static限制符将标识符的可见性限制为当前文件或当前命名空间。

☆this关键字:this是一个指向当前对象的指针,它在类的成员函数中使用。当一个对象调用它自己的成员函数时,编译器会隐式地传递一个指向该对象的指针给成员函数。通过使用this指针,可以在成员函数内部访问和操作当前对象的成员变量和成员函数。

☆final关键字:final关键字C++11引入到语言中,主要用于类和成员函数的声明中,具有以下含义:

在类声明中,final关键字用于禁止继承。如果一个类被声明为final,则其他类不能从该类派生。

在成员函数声明中,final关键字用于阻止派生类对该成员函数进行重写(override)。如果一个成员函数被声明为final,则派生类不能重写该函数。

static关键字

当我们讨论C++中的static关键字时,可以通过以下几个方面的例子来说明其用法和含义:

1.静态变量的使用

静态变量是在程序运行期间只分配一次内存空间,并且其值在多次调用中保持不变。静态变量在函数内部使用static关键字声明,在函数外部定义。例如:

#include <iostream>
using namespace std;void foo() {static int count = 0; // 声明一个静态变量count++;cout << "foo 被调用了 " << count << " 次" << endl;
}int main() {foo(); // 输出:foo 被调用了 1 次foo(); // 输出:foo 被调用了 2 次return 0;
}

在上面的例子中,count是一个静态变量。每次调用foo()函数时,count的值会自增,并且在函数调用之间保持不变。这意味着count的值在多次函数调用间被共享。

2. 静态成员函数的使用

静态成员函数属于整个类而不是某个对象实例,因此可以通过类名直接调用,无需创建对象实例。静态成员函数没有this指针,因此不能访问非静态成员。例如:

#include <iostream>
using namespace std;class MyClass {
public:static void staticFunc() {cout << "这是一个静态函数" << endl;}
};int main() {MyClass::staticFunc(); // 直接通过类名调用静态函数return 0;
}

在上述示例中,staticFunc()是一个静态函数。我们可以直接使用类名和作用域解析运算符来调用它,而无需创建类的实例。

3. 静态数据成员的使用:

在静态数据成员的使用过程中,不需要先创建类的实例,而是直接通过类名访问该成员。例如:

#include <iostream>
using namespace std;class MyClass {
public:static int count; // 声明一个静态数据成员
};int MyClass::count = 0; // 静态数据成员的定义和初始化int main() {MyClass obj1;MyClass obj2;obj1.count++;obj2.count++;cout << "obj1 的 count 值为:" << obj1.count << endl; // 输出:2cout << "obj2 的 count 值为:" << obj2.count << endl; // 输出:2return 0;
}

4. 静态局部变量的使用

静态局部变量是在函数内部声明的,但它们与普通局部变量不同。静态局部变量在程序运行期间只被初始化一次,并且在函数调用之间保持其值。示例:

#include <iostream>
using namespace std;void func() {static int count = 0;  // 声明静态局部变量count++;  // 在每次函数调用时增加count的值cout << "Count: " << count << endl;
}int main() {func();  // 输出:Count: 1func();  // 输出:Count: 2func();  // 输出:Count: 3return 0;
}

在上述代码中,函数func()内部声明了一个静态局部变量count,并将其初始值设置为0。每次调用func()函数时,静态局部变量count的值会自增,并打印出当前的值。由于静态局部变量只在编译时初始化一次,因此在多次调用func()函数时,count的值得以保留并递增。

需要注意的是,静态局部变量的生命周期从其声明处开始,一直到程序结束才终止。另外,静态局部变量的作用域仅限于声明它的函数内部。此外,请注意静态局部变量的初始值只在第一次声明时起作用,在后续调用中将被忽略。

5.在文件作用域中声明静态变量或函数

当我们在函数外定义一个变量或函数,并且在前面使用static关键字进行修饰时,将限制其在当前文件范围内可见。这样做可以避免与其他文件中具有相同名称的全局变量或函数发生冲突。

1)静态变量的文件作用域声明:

// File1.cpp
static int count = 0; // 在文件作用域中声明一个静态变量// File2.cpp
extern int count; // 使用 extern 关键字来引用另一个源文件中的静态变量int main() {count++; // 访问和修改静态变量return 0;
}

在上面的示例中,count是在File1.cpp文件的文件作用域中声明的静态变量。通过使用static关键字,我们限制了count的作用范围仅在当前源文件中。然后,在File2.cpp文件中,我们使用extern关键字来引用count变量,以便在main()函数中访问和修改它。

2)静态函数的文件作用域声明:

// File1.cpp
static void staticFunc() { // 在文件作用域中声明一个静态函数cout << "这是一个静态函数" << endl;
}// File2.cpp
extern void staticFunc(); // 使用 extern 关键字来引用另一个源文件中的静态函数int main() {staticFunc(); // 调用静态函数return 0;
}

在上述示例中,staticFunc()是在File1.cpp文件的文件作用域中声明的静态函数。通过使用static关键字,我们限制了函数的作用范围仅在当前源文件中。然后,在File2.cpp文件中,我们使用extern关键字来引用staticFunc()函数,以便在main()函数中调用它。

This关键字

C++中的this关键字用于表示当前对象的指针。它可以在类的成员函数中使用,代表调用该成员函数的对象的地址。

this指针是一个隐式参数,它是每个成员函数中都可以使用的指针。this指针指向调用该函数的对象的地址。我们可以使用this指针来访问当前对象的成员变量和成员函数。例子:

#include <iostream>
using namespace std;class MyClass {
public:void printAddress() {cout << "对象地址: " << this << endl;}
};int main() {MyClass obj;obj.printAddress(); //调用printAddress函数,并传递当前对象的地址return 0;
}

在上述示例中,printAddress函数中的this指针表示调用该函数的obj对象的地址。通过输出this的值,我们可以得到当前对象的地址。

再给出一个例子:

#include <iostream>
using namespace std;class MyClass {
private:int value;public:void setValue(int val) {this->value = val; // 使用 this 指针访问成员变量}int getValue() {return this->value; // 使用 this 指针返回成员变量的值}
};int main() {MyClass obj;obj.setValue(42);cout << "Value: " << obj.getValue() << endl;return 0;
}

在上述示例中,setValue()函数使用this指针来访问成员变量value并将其设置为参数val的值。getValue()函数也使用this指针来返回成员变量的值。

注意,this指针只能在非静态成员函数中使用,因为静态成员函数没有隐式的对象指针。而且,在全局函数或静态成员函数中不能使用this指针。

通过使用this关键字,我们可以在成员函数中准确地引用当前对象的成员,并且能够避免命名冲突或歧义。

final 关键字

final关键字是在C++11标准中引入的。它用于限制类、成员函数和虚函数的继承和重写。

1. 对于类:

在类声明中,使用final关键字可以防止该类被继承。例如:

class Base final { // 使用 final 关键字禁止继承// ...
};class Derived : public Base { // 错误!不能从 final 类派生// ...
};

2. 对于成员函数:

在成员函数声明中,使用final关键字可以防止该函数在派生类中被重写(override,覆盖)。例如:

class Base {
public:virtual void foo() final { // 使用 final 关键字禁止重写// ...}
};class Derived : public Base {
public:void foo() override { // 错误!不能重写 final 函数// ...}
};

3. 对于虚函数:

在虚函数声明中,使用final关键字可以防止派生类中的进一步重写。例如:

class Base {
public:virtual void foo() { // 虚函数可重写// ...}virtual void bar() final { // 使用 final 关键字禁止进一步重写// ...}
};class Derived : public Base {
public:void foo() override { // 可以重写基类的虚函数// ...}void bar() { // 错误!不能重写 final 虚函数// ...}
};

ok!

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

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

相关文章

如何使用自有数据微调ChatGLM-6B

构建自己的数据集 数据格式&#xff1a;问答对 官网例子 ADGEN 数据集任务为根据输入&#xff08;content&#xff09;生成一段广告词&#xff08;summary&#xff09;。 { "content": "类型#上衣*版型#宽松*版型#显瘦*图案#线条*衣样式#衬衫*衣袖型#泡泡袖…

3.8 Bootstrap 面包屑导航(Breadcrumbs)

文章目录 Bootstrap 面包屑导航&#xff08;Breadcrumbs&#xff09; Bootstrap 面包屑导航&#xff08;Breadcrumbs&#xff09; 面包屑导航&#xff08;Breadcrumbs&#xff09;是一种基于网站层次信息的显示方式。以博客为例&#xff0c;面包屑导航可以显示发布日期、类别或…

Stable Diffusion + EbSynth + ControlNet 解决生成视频闪烁

一、安装 1.1、安装ffmpeg 下载地址&#xff1a; 解压&#xff0c;配置环境变量 E:\AI\ffmpeg\bin 检查是否安装成功 1.2、安装SD的 EbSynth 插件 插件地址 https://github.com/s9roll7/ebsynth_utility 报错&#xff1a;ModuleNotFoundError: No module named extension…

【广州华锐互动】AR远程巡检系统在设备维修保养中的作用

随着科技的不断发展&#xff0c;AR(增强现实)远程巡检系统在设备检修中发挥着越来越重要的作用。这种系统可以将AR技术与远程通信技术相结合&#xff0c;实现对设备检修过程的实时监控和远程指导&#xff0c;提高设备检修的效率和质量。 首先&#xff0c;AR远程巡检系统可以帮助…

单片机尽力少用位域操作

1、在51单片机中少用uint32_t类型&#xff0c;查看汇编真的好多条指令&#xff0c;尽力避免少用。 2、在32位单片机中&#xff0c;u8、u16、u32类型操作起来基本没有什么影响&#xff0c;下图是我做的测试&#xff0c;可能测试不全面&#xff0c;按照当前测试&#xff0c;在32…

35. 搜索插入位置

给定一个排序数组和一个目标值&#xff0c;在数组中找到目标值&#xff0c;并返回其索引。如果目标值不存在于数组中&#xff0c;返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 示例 1: 输入: nums [1,3,5,6], target 5 输出: 2示例 2: 输入:…

无向图 遍历

文章目录 无向图dfn 记录 无向图 每个节点到其它节点的方向不确定&#xff0c;所以如果只按照方向遍历&#xff0c;可能会造成相互指向的死循环 dfn 记录 通过一个记录表&#xff0c;初始每个节点代表的数值是0&#xff0c;每遍历一个节点就让数值1&#xff0c;遍历过程中只…

Kubernetes_1.27.3_Harbor结合Nacos实战

Nacos 实战 作者:行癫(盗版必究) 一:Nacos简介 1.简介 ​ Nacos是 Dynamic Naming and Configuration Service的首字母简称,一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台;Nacos 致力于帮助您发现、配置和管理微服务;Nacos 提供了一组简单易用的特…

实战 ➾【Red Hat 搭建部署VSFTPd服务】

实战 ➾【Red Hat 搭建部署VSFTPd服务】 &#x1f53b; 前言&#x1f53b; 一、vsFTPd服务部署&#x1f6a5; 1.1 vsFTPd服务安装&#x1f6a5; 1.2 vsFTPd服务的启动与关闭 &#x1f53b; 二、vsFTPd相关配置&#x1f6a5; 2.1 vsFTPd的相关配置文件&#x1f6a5; 2.2 配置匿名…

SpringSecurity(6.1.x版本) 认证,授权,自定义登录,内部机制探讨

SpringSecurity 文章目录 SpringSecurityCSRF跨站请求伪造攻击SFA会话固定攻击XSS跨站脚本攻击开发环境搭建认证直接认证使用数据库认证自定义验证 其他配置自定义登录界面记住我功能 授权基于角色授权基于权限授权使用注解权限判断 内部机制探究授权校验流程安全上下文安全上下…

云事业群CTO线技术晋升考核机试题-分布式专题-D 分布式数据同步

2023年&#xff08;Q3财年&#xff09;技术部门CTO线技术人员晋升考核机试题 分布式篇-D 分布式数据同步 *参考答案* 出题人&#xff1a;湖北TL田超凡答案制定&#xff1a;湖北TL田超凡 *****试卷启用前绝密**** 1 缓存一致性产生背景 答&#xff1a;当需要频繁访问数据库…

【JAVA】方法的使用:方法语法、方法调用、方法重载、递归练习

&#x1f349;内容专栏&#xff1a;【JAVA从0到入门】 &#x1f349;本文脉络&#xff1a;JAVA方法的使用&#xff0c;递归练习 &#x1f349;本文作者&#xff1a;Melon_西西 &#x1f349;发布时间 &#xff1a;2023.7.19 目录 1. 什么是方法(method) 2 方法定义 2.1 方法…

C语言——文件操作(超全超详细)

C语言——文件操作 1. 什么是文件 磁盘上的文件是文件 但是在程序设计中&#xff0c;我们一般谈的文件有两种&#xff1a;程序文件、数据文件&#xff08;从文件功能的角度来分类的&#xff09; 1.1 程序文件 包括源程序文件&#xff08;后缀为.c&#xff09;&#xff0c;目…

教程 | 如何10秒内一键生成高质量PPT

Hi! 大家好&#xff0c;我是赤辰&#xff01; 近期新进的学员不少职场小白&#xff0c;对AI工具提效办公很感兴趣&#xff0c;今天火速给大家安排&#xff0c;ChatGPTMindShow强强联合&#xff0c;30秒内快速生成PPT&#xff0c;对于策划小白来说简直是福音呀&#xff01; 市…

用百度地图api获取当前定位,获取经纬度——前端笔记

问题&#xff1a; 做一个按钮&#xff0c;点击后可以获取到当前位置的经纬度&#xff0c;并渲染地图。 效果如下: 代码如下: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head><title>获取当前定位测试<…

精选了6款好用的AI绘画工具,值得一试

近几年来&#xff0c;伴随着AI技术的发展&#xff0c;设计领域发生了巨大的变化。AI绘图工具的出现很大程度上减轻了设计师的工作负担&#xff0c;本文精选了6款优秀的AI绘图工具为大家推荐&#xff0c;一起来看看吧&#xff01; 1、即时灵感 即时灵感作为国产的AI绘图工具&a…

PuTTY下载(免安装exe)

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

概率论和随机过程的学习和整理20:条件概率我知道,但什么是条件期望?可用来解决递归问题

目录 1 目标问题&#xff1a; 什么是条件期望&#xff1f; 条件期望有什么用&#xff1f; 2 条件期望&#xff0c;全期望公式 3 条件期望&#xff0c;全期望公式 和 条件概率&#xff0c;全概率公式的区别和联系 3.1 公式如下 3.2 区别和联系 3.3 概率和随机过程 4 有什…

国产MCU-CW32F030开发学习-BH1750模块

国产MCU-CW32F030开发学习-BH1750模块 硬件平台 CW32_48F大学计划板CW32_IOT_EVA物联网开发评估套件BH1750数字型光照强度传感器 BH1750 BH1750是一款数字型光照强度传感器&#xff0c;能够获取周围环境的光照强度。其测量范围在0~65535 lx。lx勒克斯&#xff0c;是光照强…

Rsync(二十七)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 前言 一、概述 二、特性 三、应用场景 四、数据的同步方式 五、rsync传输模式 六、rsync应用 七、rsync 命令 1. 格式 1.1 作为远程命令 1. 2 作为rsync服务 2. 选项 3.…