学习记录——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指针。

相关推荐
贾saisai1 小时前
Xilinx系FPGA学习笔记(九)DDR3学习
笔记·学习·fpga开发
北岛寒沫1 小时前
JavaScript(JS)学习笔记 1(简单介绍 注释和输入输出语句 变量 数据类型 运算符 流程控制 数组)
javascript·笔记·学习
铁匠匠匠2 小时前
从零开始学数据结构系列之第六章《排序简介》
c语言·数据结构·经验分享·笔记·学习·开源·课程设计
架构文摘JGWZ4 小时前
Java 23 的12 个新特性!!
java·开发语言·学习
小齿轮lsl4 小时前
PFC理论基础与Matlab仿真模型学习笔记(1)--PFC电路概述
笔记·学习·matlab
Aic山鱼4 小时前
【如何高效学习数据结构:构建编程的坚实基石】
数据结构·学习·算法
qq11561487074 小时前
Java学习第八天
学习
天玑y5 小时前
算法设计与分析(背包问题
c++·经验分享·笔记·学习·算法·leetcode·蓝桥杯
2301_789985945 小时前
Java语言程序设计基础篇_编程练习题*18.29(某个目录下的文件数目)
java·开发语言·学习
橄榄熊5 小时前
Windows电脑A远程连接电脑B
学习·kind