静态成员(变量、函数、单例模式(饿汉模式、懒汉模式))

本文详细介绍了C++中的静态成员,包括静态成员变量和静态成员函数的特性,以及它们在内存中的存储位置和生命周期。此外,还讨论了静态成员在类中的作用,如存储公共属性和作为全局变量、函数的替代。接着,文章阐述了单例模式的概念,列举了适用场景,并对比了饿汉模式和懒汉模式的优缺点,提供了相应的代码示例。

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

一、静态成员

    什么是静态成员:

        被static修饰过的成员变量和成员函数都称为静态成员

    普通成员的特点:

        成员变量:每个类对象中都有各自的一份成员变量,相互之间没有关联

        成员函数:隐藏了一个this指针

    静态成员的特点:

        静态成员变量:

            1、存储在bss或者data内存段中,一个类的静态成员变量只有一份,被所有类对象共享

            2、静态成员变量的生命周期不再依赖于任何对象,为程序的整个生命周期都存在

            3、既然静态成员变量不依赖任何对象,可以通过类名::静态变量名的方式不经过对象直接访问公开的静态成员变量

            4、必须在类内使用static声明,类外单独定义、初始化,在定义时不需要加static

                类型名 类名::静态变量名 = val;

        静态成员函数:

            1、没有隐藏的this指针了,所以静态成员函数中无法直接访问普通成员变量和普通成员函数,但是可以直接访问静态成员

            变量和静态成员函数

            2、虽然不能直接访问普通成员变量和普通成员函数,但是静态成员函数的作用域依然算作类内,因此只要让静态成员函数

            获得类对象的指针或引用,则依然有权限访问private、protected的普通成员变量、成员函数

            (相当于自己传一个this指针给静态成员函数)

            3、调用方式与静态成员变量类似,也不需要依赖对象也可以调用

                对象名.静态成员函数名();

                对象名->静态成员函数名();

                类名::静态成员函数名();//类对象不用创建,也可以调用静态成员函数

   

    静态成员的作用:

        1、静态成员相当于多了一层类作用域的全局变量、全局函数

        2、静态成员变量适合存储所有类对象公共属性(例如:利率、税率),这样可以节约内存资源

        3、静态成员函数可以当作访问静态成员变量的接口,这样一方面不会破坏静态成员变量的封装性,另一方面可以不需要创建

        对象即可调用静态成员函数,让类本身具有管理自己成员的能力

    常考的面试题:

        C语言和C++中的static的区别?

        (C++中static还可以定义静态成员变量、静态成员函数)




 

二、单例模式

    什么是单例模式:

        只能实例化出一个类对象

    什么情景下会使用单例模式;

        1、任务管理器/日志管理器

        2、网络访问计数器

        3、线程池

        4、服务器的连接管理器

    实现单例模式的原理:

        1、禁止在类外创建类对象,把构造函数、拷贝构造私有化

        2、确保类对象有且只有一份,在类中定一个静态成员指针或类对象

        3、提供一个获取静态类对象、指针的接口,设计静态成员函数用于获取静态类对象、指针

    饿汉模式的单例:

        程序运行时就实例化出类对象,不管后期是否用到都会创建出来

        优点:不可能被多个线程同时运行时创建多份     (线程安全)

        缺点:如果后期使用不到单例对象,浪费了资源

    懒汉模式的单例:

        知道真正使用时才创建单例类对象

        优点:什么时候用什么时候创建,如果用不到就不会创建,节约了资源

        缺点:可能多个线程同时创建,有可能会创建多份单例对象(线程不安全)

饿汉模式:

class Single

{

    static Single obj;

    Single(void)

    {  

        cout << "我是Single的无参构造" << endl;

    }

    Single(const Single& that) {}

public:

    static Single& get_obj(void)

    {

        return obj;

    }

    void show(void)

    {

        cout << &obj << endl;

    }

};

int main()

{

    Single& s = Single::get_obj();

    Single& s1 = Single::get_obj();

    s.show();

    s1.show();

}

懒汉模式

class Single

{

    static Single* obj;

    Single(void)

    {

        cout << "我是Single的无参构造" << endl;

    }

    Single(const Single& that) {}

public:

    static Single& get_obj(void)    //获取私有静态成员的接口

    {

        if(NULL == obj)

        {

            obj = new Single;  

        }

        return *obj;

    }

    void show(void)

    {

        //cout << &obj << endl;

        printf("%p\n",this);

    }

};

Single* Single::obj;    //  类外定义

void* run(void* arg)

{

    Single& s = Single::get_obj();  

}

int main(int argc,const char* argv[])

{

    printf("-----\n");

    for(int i=0; i<10; i++)

    {

        pthread_t tid;

        pthread_create(&tid,NULL,run,NULL);

    }

    sleep(3);

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xiaoyu1381

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值