浅学C++(8)C++(静态函数 单例模式)

一、静态成员
    什么是静态成员:
        被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、提供一个获取静态类对象、指针的接口,设计静态成员函数用于获取静态类对象、指针
    
    饿汉模式的单例:
        程序运行时就实例化出类对象,不管后期是否用到都会创建出来
        优点:不可能被多个线程同时运行时创建多份    (线程安全)
        缺点:如果后期使用不到单例对象,浪费了资源

    懒汉模式的单例:  
        知道真正使用时才创建单例类对象
        优点:什么时候用什么时候创建,如果用不到就不会创建,节约了资源
        缺点:可能多个线程同时创建,有可能会创建多份单例对象(线程不安全)(线程竞争问题)

饿汉模式单例

#include 
#include 
using namespace std;

//	饿汉模式单例

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;	
		printf("%p\n",this);
	}
};

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

int main(int argc,const char* argv[])
{
	printf("-----\n");
	
	//Single::obj;	obj 私有 不允许类外直接访问
	Single& s = Single::get_obj();	// 通过公开静态成员函数获取obj
	Single& s1 = Single::get_obj();
	s.show();
	s1.show();
	
}

懒汉模式单例

#include 
#include 
#include 
#include 
using namespace std;

//	懒汉模式单例

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);
	/*
	Single& s = Single::get_obj();
	Single& s1 = Single::get_obj();
	s.show();
	s1.show();
	*/
}

你可能感兴趣的:(c++,单例模式,java)