C++(静态函数)

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

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

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

cpp 复制代码
#include <iostream>
#include <string>
#include <thread>

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修饰限定对象状态的修改,因为静态函数不属于对象。静态函数中不能够对非静态成员变量进行访问,可以对静态成员变量进行访问。

cpp 复制代码
#include <iostream>
#include <string>
#include <thread>

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关键字。

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

相关推荐
郑州光合科技余经理31 分钟前
海外版多语言团购系统架构:主数据互通与核销边界
java·开发语言·前端·后端·系统架构·php·ai编程
ttwuai42 分钟前
Go 后台图片上传到对象存储后,预览 403/404 怎么排查?
开发语言·golang
我变成萤火虫1 小时前
反悔贪心(经典题目讲解)
c++·算法·贪心算法·stl·排序算法·反悔贪心
绿浪19841 小时前
c# 结构体 能不能直接封送检测
开发语言·c#
_Narcissus_1 小时前
排序算法总结表格
c语言·数据结构·c++·笔记·算法·排序算法·总结
橙橙笔记2 小时前
QT的安装
开发语言·qt·安装·软件
格林威3 小时前
C#图像像素放大:邻域平均、双线性插值实现像素放大的C#实现代码
开发语言·人工智能·数码相机·计算机视觉·c#·视觉检测·工业相机
兔兔兔兔13 小时前
记录C++ 8
开发语言·c++
名字还没想好☜3 小时前
Go 1.23 range-over-func 迭代器实战:自定义可迭代类型、提前退出与惰性求值
开发语言·后端·golang·go·迭代器
脑子不好的小菜鸟4 小时前
秋招、实习 小知识点复习 (C/C++/Linux)—— 碎片时间可看
c++·求职招聘