C++中static关键字修饰类

本文深入探讨了C++中的static关键字在类中的应用,包括静态成员变量、静态成员函数的定义、初始化及其作用。详细解释了静态成员如何在类实例间共享数据,以及静态成员函数的特点和使用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include <iostream>

using namespace std;

#if 0
static
全局变量 外链性(external link),仅限于本文件,也就是限定了作用域

局部变量auto:static影响了生命周期(和main()函数的生命周期是一样的)和存储位置(不存储在栈上了,而是存储在data段上的rw段
如果未初始化了就在bss段)
重要注释:
①RO_data:ReadOnly data,即只读数据域,它指程序中用到的只读数据,全局变量,例如C语言中const关键字定义的全局变量就
是典型的RO-data。
②RW_data:ReadWrite data,即可读写数据域,它指初始化为“非0值”的可读写数据,程序刚运行时,这些数据具有非0的初始值,且运
行的时候它们会常驻在RAM区,因而应用程序可以修改其内容。例如全局变量或者静态变量,且定义时赋予“非0值”给该变量进行初始化。
③ZI_data:ZeroInitialie data,即0初始化数据,它指初始化为“0值”的可读写数据域,它与RW_data的区别是程序刚运行时这
些数据初始值全都为0,而后续运行过程与RW-data的性质一样,它们也常驻在RAM区,因而应用程序可以更改其内容。包括未初始化的
全局变量,和初始化为0的全局变量。
④RO:只读区域,包括RO_data和code。
⑤Code:即代码域,它指的是编译器生成的机器指令。
⑥BSS段:BSS段(bss segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域。
⑦数据段:数据段(data segment)通常是指用来存放程序中已初始化的全局变量的一块内存区域。
⑧代码段:代码段(code segment/text segment)通常是指用来存放程序执行代码的一块内存区域。这部分区域的大小在程序运
行前就已经确定,并且内存区域通常属于只读, 某些架构也允许代码段为可写,即允许修改程序。在代码段中,也有可能包含一些只读
的常数变量,例如字符串常量等。
#endif

#if 0
static 在类内部的表现,用来实现族类对象间的数据共享。

在生成对象的时候,普通数据成员才有空间。而static成员在类声明的时候,就已经开辟了空间(data rw)

static数据成员,即属于类,也属于对象,但终归属于类。

1、初始化:类内定义,类外初始化。type 类名::变量名 = 初值
2、使用:static数据成员,即属于类,也属于对象,但终归属于类。


;
#endif

namespace Space
{
    int share = 1111;
}
class A
{
public:
    void func()
    {
        cout<<share<<endl;
    }
    void modify(int m)
    {
        share = m;
    }
    int x, y;
    static int share;
};

int A::share = 100;
int main()
{
    A a, b, c;

    /*cout<<"sizeof(A)= "<<sizeof(A)<<endl;//8
    cout<<"sizeof(a)= "<<sizeof(a)<<endl;//8
    cout<<"sizeof(b)= "<<sizeof(b)<<endl;//8
    cout<<"sizeof(c)= "<<sizeof(c)<<endl;//8
    a.func();*/
/*
    a.func();
    a.modify(2000);
    b.func();           //修改成功
*/

    cout<<A::share<<endl;//在没有类对象的时候,我可以通过类名访问你,这就是为什么说终归属于类
    cout<<Space::share<<endl;
    return 0;
}
#include <iostream>

using namespace std;

//static修饰成员函数,它的作用只有一个,用于管理static成员
//static修饰的成员函数,即属于类,也属于对象,但终归属于类
//static修饰的成员函数,因为它属于类,所以没有this指针,不能访问非static 数据成员及成员函数
class School
{
public:
    string& getTower()
    {
        return tower;
    }
    static string& getLib()
    {
        tower = "abcd";//这一句报错,因为调用getLib()函数时无法把对象的指针传进来,所以函数根本分不清这是
                       //哪一个对象的tower
        return lib;
    }

private:
    string tower;
    string lake;
    static string lib;
};
string School::lib = "";
int main()
{
    School::getLib() = "abcd";//不需要对象就可以被调用
    School::getLib() += "efgh";

    School cz, bn, blueshit;
    cz.getTower() = "boyala";
    bn.getTower() = "shuita";
    blueshit.getTower() = "wajueta";

    cz.getLib() += "传值就职";
    bn.getLib() += "鸟人";
    blueshit.getLib() += "挖掘机";

    cout<<cz.getLib()<<endl;
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值