C++基础篇:05 静态成员与单例模式

1 静态成员

1.1 什么是静态成员

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

1.2 普通成员的特点

        普通成员变量:每个类对象中都独有一份成员变量,相互之间没有任何关联

        普通成员函数:都隐藏着一个this指针

1.3 静态成员的特点

        静态成员变量:

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

                ② 静态成员变量的生命周期不依赖于任何的对象,为整个程序的生命周期

                ③ 静态成员变量必须通过static声明在类内,在类外单独定义、初始化,在定义时不能加static

                ④ 因为静态成员变量不依赖于任何类对象,因此可以直接通过 类名::静态成员变量名 的方式来访问,不需要创建对象或依赖对象

1.4 静态成员函数

        格式:

                static 返回值 函数名(参数列表){} //声明与定义可以不分开

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

            ② 虽然静态成员函数不能直接访问普通成员,但是静态成员函数的作用域依然算是类内的,因此只要让静态成员函数获得类对象的指针或引用,依然有权限间接访问private\protected的普通成员

static void func(Test* t)
{
    t->普通成员;
}
static void func(Test& t)
{
    t.普通成员;
}

           ③ 调用方式:

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

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

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

   

1.5 静态成员的作用:

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

        ② 静态成员变量适合存储所有类对象共享的公共属性(汇率、利率、税率)

       ③ 静态成员函数可以当做私有的静态成员变量的公开访问接口,这样做一方面可以不需要实例化对象就可调用类内的静态成员;另一方面这样也不会破坏类的封装性;总体上是为了让类拥有管理自己静态成员的能力

2 单例模式

2.1 什么是单例模式

        只能实例化出一个类对象

2.2 什么场景下使用单例模式

        ① 任务管理器\日志管理器

        ② 网站访问统计计数器

        ③ 线程池、内存池

        ④ 服务器的连接管理器 accept

2.3 实现单例模式的原理

① 禁止在类外实例化对象,把构造函数私有化

② 确保类对象有且只有一份,在类中定义一个静态的类类型对象(对象(饿)、对象指针(懒))

③ 提供一个公开的获取静态类对象的接口,通过公开静态成员函数来实现

2.4 饿汉模式的单例

        在程序运行前就实例化出单例的类对象,无论后期是否用到都会一开始就完成实例化

        优点:不可能被多个线程同时运行创建多个类对象,线程安全的单例模式

        缺点:如果后期使用不到,就浪费资源、时间

2.5 懒汉模式的单例

        当程序运行到第一次使用类对象时,才会实例化单例的类对象

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

        缺点:当多个线程同时第一次获取类对象时,就可能创建出多份,线程不安全的单例

你可能感兴趣的:(C++,c++,java,单例,静态成员)