学习记录——day41 C++ 类的静态成员 static

静态成员,是类中不依赖于类对象而独立存在的成员变量,但仍然属于类,是成员的一种

静态成员的空间分配发生在出现编译阶段,不占用类的空间

静态成员分为,静态成员变量和静态成员函数

静态成员变量

1、相关概念

1)静态成员的权限一般为public,必须在全局处进行定义,类内只是声明,如果没有在全局处进行定义,那么默认为0

2)静态成员变量,不占用类对象的内存空间,在编译时系统就分配了内存空间

3)虽然静态成员不占用类对象的空间,但是,也可以通过类对象调用静态成员变量

4)所有类对象,共享该静态成员变量,无论实例化多少个类对象,静态成员只有一份

5)静态成员变量,从功能上来说,可以理解成是一个全局变量,但是相比于全局变量而言,静态成员变量更加体现了类的封装性

2、定义及访问

1)定义格式:在定义成员变量时,在前面加关键字static,该成员变量就是静态成员变量

2)静态成员变量的访问

a.对象名.静态成员变量

b.类名::静态成员变量

cpp 复制代码
#include <iostream>

using namespace std;

class Demo
{
private:
    int p;
public:
    static int s;

};

int Demo::s = 0;

int main()
{

    //通过类名引用
    Demo::s++;
    cout<<Demo::s<<endl;

    //通过类对象引用
    Demo d;
    d.s++;
    cout<<d.s<<endl;

    return 0;
}

静态成员函数

1、相关概念

1)和静态成员变量一样,不依附于某个具体的类对象,属于整个类的

2)静态成员函数中,只能使用静态成员变量,不能使用非静态成员变量

3)静态成员变量中没有this指针,但是,同名的静态成员函数与非静态成员函数不构成重载关系

2、定义及调用

1)定义格式:在定义成员函数前加关键字static,那么该函数就是静态成员函数

2)静态成员函数的调用方式也有两种:通过类对象调用,通过类名直接调用

cpp 复制代码
#include <iostream>

using namespace std;

class Demo
{
private:
    int p;
public:
    static int s;

    //非静态成员函数
    void show()
    {
        cout<<p<<endl;
    }

    //静态成员函数
    /*
    static void show()
    {
        cout<<p<<endl;
    }
    */
    //静态成员函数 与 同名非静态成员函数 不构成重载
    //error: static and non-static member functions with the same parameter types cannot be overloaded
    //note: previous definition is here

    //静态成员函数中 只能使用 静态成员变量
    //error: invalid use of member 'p' in static member function

    static void show(int)//哑元占位
    {
        cout<<s<<endl;
    }
};

int Demo::s = 0;

int main()
{
    //静态成员函数 在类实例化前 也能使用
    //通过类名调用
    Demo::show(50);//哑元接收 50无意义 仅占位

    //通过类对象引用
    Deom d;
    d.show(20);

    return 0;
}

C/C++中static总结

1、修饰函数的局部变量,表示将当前变量独立于整个函数而存在,其生命周期随着整个程序的编译而产生,整个程序结束而终止,即使函数没有被调用,静态成员变量的内存空间也已经存在了,即使函数以及运行结束,静态成员变量的生命周期也没有结束。一次初始化,后期调用函数时,都具有保值功能。

2、修饰类中成员变量,为静态成员变量,不依附于类对象而存在,编译时系统分配空间,需要在全局处进行定义。即使没有类对象,也可以通过类名直接使用,也可以通过类对象进行使用。多个对象,共享静态成员变量,即使类对象的空间全部都释放后,静态成员的空间也没有结束,而是随着整个程序的结束而结束。

3、修饰全局变量时,表示限制作用域为当前文件,只能在当前文件内使用该全局变量,其他文件不能使用,即使使用extern也不可以

4、修饰全局函数时,表示限制作用域为当前文件,只能在当前文件内使用该函数,其他文件中不可以使用,即使使用了联合编译

5、修饰类中的成员函数,表示静态成员函数,独立于类体而存在,也可以使用类对象进行调用。即使没有实例化对象,也可以类名调用,静态成员函数中,只能访问静态成员变量,不能访问非静态成员变量。没有this指针。

相关推荐
2025年一定要上岸3 分钟前
【日常学习】10-15 学习re
学习·算法·正则表达式
千码君201625 分钟前
Go语言:记录一下Go语言系统学习的第一天
java·开发语言·学习·golang·gin·并发编程·编译语言
学工科的皮皮志^_^37 分钟前
电压源和电流源学习理解
单片机·嵌入式硬件·学习
骁的小小站1 小时前
Learn C the Hardway学习笔记和拓展知识(一)
c语言·开发语言·c++·经验分享·笔记·学习·bash
我命由我123451 小时前
PDFBox - PDDocument 与 byte 数组、PDF 加密
java·服务器·前端·后端·学习·java-ee·pdf
楼田莉子2 小时前
C++学习:异常及其处理
开发语言·c++·学习·visual studio
能不能别报错2 小时前
K8s学习笔记(二十) 亲和性、污点、容忍、驱逐
笔记·学习·kubernetes
kuniqiw2 小时前
远程处理器协议框架学习
学习
hmbbcsm2 小时前
python学习之路(二)
学习
冷崖2 小时前
定时器的学习(二)
linux·c++·学习