C++零碎记录(五)

9. 静态成员

① 静态成员就是在成员变量和成员函数前加上关键字static,称为静态成员。

② 静态成员分为:

  1. 静态成员变量
    --所有对象共享同一份数据
    --在编译阶段分配内存
    --类内声明,类外初始化
  2. 静态成员函数
    --所有对象共享同一个函数
    --静态成员函数只能访问静态成员变量

③ 调用静态成员函数有两种方法:

  1. 通过对象调用
  2. 通过类名调用

9.1 静态成员变量

复制代码
#include<iostream>
using namespace std;

//静态成员变量
class Person
{
public:
    //1、所有对象都共享同一份数据
    //2、编译阶段就分配内存
    //3、类内声明,类外初始化操作
    static int m_A;

//静态成员变量也是有访问权限的
private:
    static int m_B;
};

int Person::m_A = 100;

void test01()
{
    Person p;
    cout << p.m_A << endl;

    Person p2;
    p2.m_A = 200;

    //100 ? 200,共享同一份数据,所以p.m_A为200
    cout << p.m_A << endl;
}

void test02()
{
    //静态成员变量 不属于某个对象上,所有对象都共享同一份数据
    //因此静态成员变量有两种访问方式
    
    //1、通过对象进行访问
    Person p;
    cout << p.m_A << endl;

    //2、通过类名进行访问
    cout << Person::m_A << endl;

    //cout << Person::m_B << endl; //报错,私有作用域,出了类是不可以访问的
}

int main()
{
    test01();

    test02();

    system("pause");
}

运行结果:

  • 100
  • 200
  • 200
  • 200
  • 请按任意键继续. . .

9.2 静态成员函数

复制代码
#include <iostream>
using namespace std;

//静态成员函数
//所有对象共享同一个函数
//静态成员函数只能访问静态成员变量
class Person
{
public:
    //静态成员函数
    static void func()
    {
        m_A = 100; //静态成员函数可以访问静态成员变量,这个数据是共享的,只有一份,所以不需要区分哪个对象的。                                
        //m_B = 200; //静态成员函数不可以访问非静态成员变量,无法区分到底是哪个对象的m_B属性,非静态成员变量属于特定的对象上面
        cout << "static void func调用" << endl;
    }
    
    static int m_A; //静态成员变量
    int m_B; //非静态成员变量

    //静态成员函数也是有访问权限的
private:
    static void func2()
    {
        cout << "static void func2调用" << endl;
    }
};

int Person::m_A = 0;

//有两种访问方式
void test01()
{
    //1、通过对象访问
    Person p;
    p.func();

    //2、通过类名访问
    Person::func();   //静态成员函数,所有对象共享同一个函数,可以直接通过类名访问。

    //Person::func2(); //类外访问不到私有静态成员函数
}

int main()
{
    test01();

    system("pause");

    return 0;

}

运行结果:

  • static void func调用
  • static void func调用
  • 请按任意键继续. . .

9.3 成员变量和成员函数分开存储

① 在C++中,类内对的成员变量和成员函数分开存储,只有非静态成员变量才属于类的对象上。

复制代码
#include <iostream>
using namespace std;

class Person01
{
public:
    
};

class Person02
{
public:
    int m_A; //非静态成员变量  属于类的对象上

    static int m_B;  //静态成员变量 不属于类对象上

    //void fun(){} //非静态成员函数 不属于类对象上

    static void func2() {} //静态成员函数 不属于类的对象上
};

int Person02::m_B = 0;

void test01()
{
    Person01 p;

    //空对象占用内存空间为:1
    //C++编译器会给每个空对象也分配一个字节空间,是为了区分空对象占内存的位置
    //每个空对象也应该有一个独一无二的内存空间
    cout << "size of p = " << sizeof(p) << endl;
}

void test02()
{
    Person02 p2;

    cout << "size of p2 = " << sizeof(p2) << endl;  //通过打印内存空间大小,检测静态成员变量、非静态成员函数等在不在对象内存上....      
}

int main()
{
    test01();
    test02();  

    system("pause");

    return 0;

}

运行结果:

  • size of p = 1
  • size of p2 = 4
  • 请按任意键继续. . .

链接:https://www.zhihu.com/question/437657370/answer/1692846096

相关推荐
黑客思维者32 分钟前
Python大规模数据处理OOM突围:从迭代器原理到TB级文件实战优化
开发语言·python·github·迭代器·oom
繁华似锦respect1 小时前
C++ 智能指针底层实现深度解析
linux·开发语言·c++·设计模式·代理模式
lkbhua莱克瓦241 小时前
IO流练习(加密和解密文件)
java·开发语言·笔记·学习方法·io流·io流练习题
偶像你挑的噻1 小时前
3.Qt-基础布局以及事件
开发语言·数据库·qt
CHANG_THE_WORLD2 小时前
Python 学习三 Python字符串拼接详解
开发语言·python·学习
诸葛老刘2 小时前
next.js 框架中的约定的特殊参数名称
开发语言·javascript·ecmascript
Bona Sun2 小时前
单片机手搓掌上游戏机(二十三)—esp32运行简单街机模拟器软硬件准备
c语言·c++·单片机
霸王大陆3 小时前
《零基础学 PHP:从入门到实战》模块十:从应用到精通——掌握PHP进阶技术与现代化开发实战-2
android·开发语言·php
釉色清风3 小时前
在openEuler玩转Python
linux·开发语言·python
han_hanker3 小时前
这里使用 extends HashMap<String, Object> 和 类本身定义变量的优缺点
java·开发语言