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

详细介绍:C++(静态函数)

详细介绍:C++(静态函数)

C++中的静态函数通过static关键字进行修饰,静态函数不属于对象,而是属于类。

静态函数只能访问类的静态成员表变量或者静态函数,无法直接访问非静态成员,因为静态函数没有this指针。可以通过类名或者对象来调用静态函数。

静态函数存储在全局数据区,独立于对象实例存在,生命周期与程序生命周期相同。

#include
#include
#include
class A {
public:
virtual ~A() {
std::cout << "类A的析构函数" << std::endl;
}
virtual void func() = 0 {
std::cout << "类A的func()函数" << std::endl;
}
};
class B :public A {
public:
B():B_private(0){
std::cout << "类B的无参构造" << std::endl;
}
B(int B_private):B_private(B_private){
std::cout << "类B的有参构造" << std::endl;
}
~B() {
std::cout << "类B的析构函数" << std::endl;
}
void func()override {
std::cout << "类B的func()函数" << std::endl;
}
virtual static void Get()const {
std::cout << target << std::endl;
std::cout << B_private << std::endl;
}
private:
int B_private;
static int target;
};
int main() {
return 0;
}

运行结果:

从报错信息可以知道静态函数,不能够声明为虚函数,因为虚函数依赖对象的虚函数表指针,而静态函数并不属于对象。静态函数也不能够对其进行使用const修饰限定对象状态的修改,因为静态函数不属于对象。静态函数中不能够对非静态成员变量进行访问,可以对静态成员变量进行访问。

#include
#include
#include
class A {
public:
virtual ~A() {
std::cout << "类A的析构函数" << std::endl;
}
virtual void func() = 0 {
std::cout << "类A的func()函数" << std::endl;
}
};
class B :public A {
public:
B():B_private(0){
std::cout << "类B的无参构造" << std::endl;
}
B(int B_private):B_private(B_private){
std::cout << "类B的有参构造" << std::endl;
}
~B() {
std::cout << "类B的析构函数" << std::endl;
}
void func()override {
std::cout << "类B的func()函数" << std::endl;
}
static void Get() {
std::cout << target << std::endl;
}
private:
int B_private;
static int target;
};
int B::target = 10;
int main() {
B::Get();
return 0;
}

运行结果:

注意静态成员变量在类内声明,必须在类外定义并初始化。成员函数可以在类内进行声明内部直接实现,也可以类内声明后在类外定义。需要注意的是无论是成员常量和成员函数在类外进行定义时不能重复使用static关键字。

静态成员函数本质是代码段,编译时已确定地址,而静态成员变量需要分配独立内存空间,必须在类外显示定义分配存储区。

http://www.zskr.cn/news/5404.html

相关文章:

  • 2025.9.15日软件工程学习日志
  • 为什么不建议在 Docker 中跑 MySQL?
  • reLeetCode 热题 100-1 指针283. 移动零 - MKT
  • 解决c# DocX生成的word文档wps打开排版外边距错乱微软office正常问题
  • 机器视觉之图像处理篇 - 指南
  • if __name__ == __main__:
  • f-string用法
  • libdpi.dll libdatareport.dll libdash_plugin.dll libcurl-x86.dll libcurl-x64.dll libcurl_x64.dll - 指南
  • 理解 Kubernetes CSI
  • 利用RabbitMQ与Redis实现消息的延迟传递的策略
  • 实现我的第一个本地文档问答机器人
  • 关于32位单片机使用lwip无法访问(ping)外网,只能与同网段设备进行通信的问题解决
  • GoFrame框架查询数据表时对字段取别名
  • 离散数学课堂习题及课后习题 - PPX
  • Docker如何获取镜像
  • 偏移寻址
  • 黑客必备的DevOps实战工作坊:4小时动手实验指南
  • 金融业-数字化转型大赛-网络安全赛道部分wp
  • MySQL注意事项与规范 - 实践
  • 西电微机原理-第七章 常用接口器件
  • CF1264D1 Beautiful Bracket Sequence (easy version)
  • 西电微机原理-第六章 输入输出技术
  • c#给原文件重命名
  • 提升员工绩效的5大人才管理软件评测与分析
  • LLaVA- Improved Baselines with Visual Instruction Tuning - jack
  • Liunx 硬盘扩容
  • 基于WSL下载Hadoop和HBASE
  • revit二次开发之 钢筋功能详细分析
  • java-wxj02
  • 利用Myo臂环采集肌电信号和角速度来实现实时手势识别