C++笔记-6-c++静态与单例
前言
自学笔记,没有历史知识铺垫(省略百度部分)C++笔记-6-c++静态与单例
一、静态
静态成员变量
含义:将静态变量作用域,限制在类中共享使用
class Order
{
public:
// 声明静态成员变量
static string order_no;
};
// 数据类型 类名::变量名 = 赋值(定义静态成员变量需要在类外)
string Order::order_no = "SS.20221225.001";
int main()
{
// 通过类名作用访问
cout << Order::order_no << endl;
}
// 执行结果
SS.20221225.001
静态成员函数
class Order
{
public:
Order(string order_no_arg, string remark_arg)
{
order_no = order_no_arg;
remark = remark_arg;
}
// 静态成员函数
static void printOrder(Order order)
{
cout << "no:" << order.order_no << ",remark:" << order.remark << endl;
}
private:
string order_no;
string remark;
};
int main()
{
Order order1("SS.20221225.001", "备注1");
Order::printOrder(order1);
Order order2("SS.20221225.002", "备注2");
Order::printOrder(order2);
}
// 执行结果
no:SS.20221225.001,remark:备注1
no:SS.20221225.002,remark:备注2
二、单例
饿汉式
class Singleton
{
public:
static Singleton &getInstance(void)
{
return s_instance;
}
void printf()
{
cout << flag << endl;
}
private:
Singleton(int flag_arg) : flag(flag_arg)
{
cout << "饿汉式单例创建成功" << endl;
}
Singleton(const Singleton &);
static Singleton s_instance;
private:
int flag;
};
Singleton Singleton::s_instance(222);
int main()
{
cout << "启动程序" << endl;
Singleton &s1 = Singleton::getInstance();
Singleton &s2 = Singleton::getInstance();
s1.printf();
s2.printf();
return 0;
}
// 执行结果
饿汉式单例创建成功
启动程序
222
222
懒汉式
class Singleton
{
public:
static Singleton &getInstance(void)
{
// 双重检测
if (s_instance == nullptr)
{
lock_guard<mutex> lck(_mtx); // 加锁, C++ RAII机制,{}结束时,自动解锁
if (s_instance == nullptr)
{
s_instance = new Singleton(345);
}
}
return *s_instance;
}
void printf()
{
cout << flag << endl;
}
void release(void)
{
if (s_instance != nullptr)
{
delete s_instance;
s_instance = nullptr;
}
}
private:
Singleton(int flag_arg) : flag(flag_arg)
{
cout << "懒汉式单例创建成功" << endl;
}
Singleton(const Singleton &);
~Singleton()
{
cout << "单例销毁成功" << endl;
}
static Singleton *s_instance;
private:
static mutex _mtx;
private:
int flag;
};
Singleton *Singleton::s_instance = nullptr;
mutex Singleton::_mtx;
int main()
{
cout << "启动程序" << endl;
Singleton &s1 = Singleton::getInstance();
s1.printf();
s1.release();
Singleton &s2 = Singleton::getInstance();
s2.printf();
s2.release();
return 0;
}
总结
- C++ RAII机制
- C++ NULL存在二义性问题,可使用
nullptr
代表空
本章主要为C++笔记-6-c++静态与单例