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 懒汉模式的单例
当程序运行到第一次使用类对象时,才会实例化单例的类对象
优点:什么时候使用什么时候创建,如果用不到就不会创建,节约资源
缺点:当多个线程同时第一次获取类对象时,就可能创建出多份,线程不安全的单例