单例模式:
整个程序有且只有一个实例,该类自己负责创建自己的对象,并且保证只有一个实例。
单例模式可以分为饿汉式和懒汉式:
饿汉式:类加载时就进行实例化,启动较慢,但是线程安全。
class Singleton //饿汉式
{
private:
static Singleton *Instance;
Singleton(){};
Singleton(const Singleton& rhs) = delete;
Singleton operator =(const Singleton ths) = delete;
public:
~Singleton(){};
static Singleton* GetInstance()
{
return Instance;
}
};
Singleton *Singleton::Instance = new Singleton();
懒汉式:类加载时不进行实例化,在第一次访问实例时构建实例。启动快。
线程安全的,只是构造时线程安全,如果有写操作需要另外自己加锁。
class Singleton //懒汉式
{
private:
Singleton(){};
Singleton(const Singleton& rhs) = delete;
Singleton operator =(const Singleton rhs) = delete;
public:
~Singleton(){};
static Singleton& GetInstance()
{
static Singleton Instance;
return Instance;
}
};
关于单例模式就说这些,下面记录以此引出的一些学习的知识。
学习:
1、在懒汉式单例模式中,怎么保证单例?为什么是线程安全的呢?
首先,局部静态变量只会初始化一次,所以保证了单例。
C++11标准中的Magic Static特性:如果变量在初始化时并发同时进入声明语句,并发线程会阻塞比你高等待初始化结束。
2、构造函数、拷贝构造函数和赋值运算符:
在单例模式的实现中,对这三个方面进行了保护。下面分析一下何时会调用拷贝构造函数,何时会调用赋值函数:
对象不存在,且没用别的对象来初始化,就是调用了构造函数;
对象不存在,且用别的对象来初始化,就是拷贝构造函数
对象存在,用别的对象来给它赋值,就是赋值函数。
3、静态全局变量和静态局部变量:
均只初始化一次。
生存周期:
静态全局变量:编译器会在程序的main()函数执行之前插入一段代码,用来初始化全局变量。所以生存期是程序开始到结束。
静态局部变量:从定义它的语句第一次被执行到程序结束。
作用域:
静态全局变量:定义其的文件内,和普通全局变量不同的是,普通全局变量作用域是整个工程。
静态局部变量:定义其的函数内。
4、指针和引用
1、在语法上最大的区别就是是指针可以为NULL,并可以通过delete运算符删除指针所指的实例,而引用则不可以。
2、编译器的实现来说,声明一个引用并没有为引用分配内存,它仅仅是变量的别名,声明一个指针则分配了内存。
3、sizeof对引用是它所指向对象的大小,对指针则是指针自身的大小
4、引用创建时必须初始化,指针不用。
先写这么些