看一篇关于单例模式文章之后的学习

单例模式:

整个程序有且只有一个实例,该类自己负责创建自己的对象,并且保证只有一个实例。

单例模式可以分为饿汉式和懒汉式:

饿汉式:类加载时就进行实例化,启动较慢,但是线程安全。

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、引用创建时必须初始化,指针不用。

 

先写这么些

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值