九、静态成员变量和静态成员函数

本文详细介绍了C++中静态成员变量的概念,它们的共享机制,以及静态成员函数的特点,包括其访问限制和适用场景,如单例模式和算法封装。
摘要由CSDN通过智能技术生成

一、定义静态成员变量

·关键字 static 可以用于声明一个类的成员,静态成员提供了一个同类对象的共享机制

·把一个类的成员声明为static时,这个类无论有多少个对象被创建这些对象共享这个static成员

·静态成员变量不是类或者对象的成员变量,但是他的作用域是在类和类的所有的实例化对象

class cat
{
public:
    char name[4];
    int age;

    cat()
    {
        cout<<"cat()"<<endl;
        cnt++;
    }
    ~cat()
    {
        cout<<"~cat()"<<endl;
        cnt--;
    }
    static int cnt ;//只是声明一个静态成员变量,不是类或者对象的成员变量,但是他的作用域是在类和类的所有的实例化对象
};

int cat::cnt =0;//定义了cat这个类中的静态成员变量cnt,并且初始化为0(如果不初始化默认为0)

int main()
{
    cout<<sizeof(cat)<<endl;//大小为8,static int cnt不是类或者对象的成员变量
    cat *p = new cat[4];
    cout<<cat::cnt<<endl;//4
    cat s1;
    cout<<cat::cnt<<endl;//5
    cat s2;
    cout<<cat::cnt<<endl;//6

    return 0;
}

二、类的静态成员函数

1、使用static修饰的成员函数叫做静态成员函数

2、在静态成员函数内不能够访问除静态成员变量以外的其他成员变量

3、静态成员函数的调用:

A、对象.静态成员函数()

B、类名::静态成员函数()*建议使用类访问静态成员变量和成员函数,因为这种方式可读性强*

class cat
{
public:
    char name[4];
    int age;

    cat()
    {
        cout<<"cat()"<<endl;
        cnt++;
    }
    ~cat()
    {
        cout<<"~cat()"<<endl;
        cnt--;
    }
    //静态的成员函数
    static int cat_num() //没有this指针,不能访问非静态成员变量
    {
        return cnt;//访问静态成员变量
    }
    static int cnt ;//只是声明一个静态成员变量,不是类或者对象的成员变量,但是他的作用域是在类和类的所有的实例化对象
};

int cat::cnt =0;//定义了cat这个类中的静态成员变量cnt,并且初始化为0(如果不初始化默认为0)

int main()
{
    cout<<sizeof(cat)<<endl;//大小为8,static int cnt不是类或者对象的成员变量

    cat *p = new cat[4];
    cat s1;
    cat s2;
    cout<<cat::cnt<<endl;//6

    cout<<s1.cat_num()<<endl;//6
    cout<<cat::cat_num()<<endl;//6,建议使用类访问静态成员变量和成员函数,因为这种方式可读性强
    return 0;
}

4、为什么静态的成员函数不能够访问对象/类的成员变量?

因为静态成员函数不属于对象!

5、什么时候可以将函数设计成静态成员函数?

函数的行为跟类的实例无关,只跟类有关

静态成员函数的用处:

·访问被private/protected 修饰静态成员变量

·可以实现某些特殊的设计模式:如Singleton(单例模式)

·可以封装某些算法,如何数学函数,如ln,sin,tan等等,这些函数本就没必要属于任何一个对象,所有从类的调用感觉更好,如何定义一个数学函数类Math,调用Math::sin(3.14);如果非要用非静态函数,那就必须:Math math;math.sin(3.14);可以是可以,就是为了一个根本无状态存储可言的数学还要引入一次对象的构造和一次对象的析构,显然不好。

  • 8
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值