C++ 静态成员变量和静态对象

本文介绍了C++中如何使用静态成员变量来确保全班学生对象中总人数的一致性。静态成员变量不属于任何对象,由类共享,初始化必须在类外部完成。它们可以直接通过类名访问,且在程序开始时分配内存,结束时释放。同时,静态成员函数只能访问静态成员。相比全局变量,静态成员更符合面向对象思想,并且提供了更好的数据共享方式。此外,还讨论了为何C++中较少使用全局变量共享数据的原因。

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

问题引入:

假如一个班中又有一个学生类,学生类中有一个成员变量是总班级人数,现插班进来一个,怎么保证所有学生对象中的总人数一致变化。

为了解决这个问题,总人数相关的变量应该被所有学生共享。最简单的办法是用static修饰,让其变为静态成员变量。

静态成员变量特点:

1.静态成员变量不属于任何一个对象,它单独保存在类的外面,且独有一份,但是所有成员都能访问他,访问它不需要人this指针

2.不能在类对象初始化时或者成员函数调用时进行初始化,必须单独初始化。

class A
{
    static int familyNUM; //静态成员变量声明
public:
    A()
    {
       familyNUM++; 
    }
    void check()
    {
        cout << familyNUM <<endl;
    }
};

int A::familyNUM=0; //初始化

int main()
{
    A a;
    a.check();  //输出  1
    A b;
    b.check();  //输出  2
}

 3.当静态成员变量被public修饰后,可以不依赖对象直接进行访问,访问格式:类名::静态成员变量名。

public: static int familyNUM; //公开静态成员变量声明
int main()
{
    A::familyNUM++; //静态的可以在对象实例化前就进行访问
    A a;
    a.check(); //输出  2
}

4.类的静态成员函数只能访问类的静态成员变量,因为非静态成员变量只有对象存在才有意义。

当静态对象诞生时其构造函数被执行,当程序要结束时,析构函数才执行,随进程持续性。

错误示例:

class A
{
 int familyNUM; //公开静态成员变量声明
public:
    A(int x)
    {
       familyNUM=x; 
    }
    static void check()
    {
        cout << familyNUM <<endl;
    }
};

int A::familyNUM=0; //初始化

// A a;
    // a.check();  //输出  1
    // A b;
    // b.check();  //输出  2
int main()
{
    A::familyNUM++; //静态的可以在对象实例化前就进行访问
    A a(3);
    a.check(); 
}

运行结果:invalid use of member 'A::n' in static member function

延申:为什么C++很少使用全局变量共享数据

(1)全局变量不符合面向对象思想

(2)同类不同对象可以用静态成员变量共享

(3)不同类的对象之间要共享数据,一般使用容器(堆空间),然后以传递地址的方式访问。

 链接:容器(待补)

下一章节:C++友元函数和友元类(C++ friend关键字)(链接待补)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值