c++ 11之前无法保证static 变量线程安全,c++ 11之后是线程安全的。
主体思想:
class my_class;
my_class& get_my_class_instance()
{
static my_class instance;
return instance;
}
完整代码:
#include <iostream>
#include <Windows.h>
using namespace std;
class A {
private:
A() {
//因为其他构造被显式禁用了,所以编译器不再自动生成默认构造,需要显式指定
}
~A() {
}
A(const A& a) = delete; //禁用拷贝构造,如果没有,则可能发生A aaa(aa);,从而导致多个实例存在,加上以后A aaa(aa);会在编译时报错
A& operator=(const A& a) = delete; //禁用拷贝赋值,如果没有,则可能发生A aaa = aa;,从而导致多个实例存在,加上以后A aaa = aa;会在编译时报错
A(const A&& a) = delete; //禁用移动构造,如果没有,则可能发生A aaa = std::move(aa);,从而导致多个实例存在,加上以后A aaa = std::move(aa);会在编译时报错
A& operator=(const A&& a) = delete; //禁用移动赋值,如果没有,则可能发生A aaa(std::move(aa));,从而导致多个实例存在,加上以后A aaa(std::move(aa));会在编译时报错
public:
static A& getA() {
static A a;
return a;
}
};
int main()
{
A& aa = A::getA();
//A aaa = aa;
//A aaa(aa);
//A aaa = std::move(aa);
//A aaa(std::move(aa));
std::cout << "Hello World!\n";
while (1) Sleep(1000);
}