知识补充:
一.
static 成员变量
1. 一定要在类外初始化
2. 静态成员变量属于类作用域
3. 不依赖对象
static 成员方法
1. _cdecl调用约定 没有this指针
2. 不依赖对象调用
3. 能看见类中所有的成员
* ->*
这两个操作符号是函数指针调动类成员方法的时候
二.
1.构造函数的初始化列表
构造函数的初始化列表的执行顺序和成员变量的声明有关
2. 常对象只能调动常方法
普通对象还可以调用常方法
常方法中不能调动普通方法
普通方法中可以调用常方法
3.类的扫描
1.扫描类名
2.扫描类成员
3.返回值 形参 默认值
4.函数体
三.
单例模式(一个对象只生成一个对象),所以:
1.屏蔽生成对象的接口
2.提供公有的接口生成对象
四.实现:
//线程不安全的
class SingleTon
{
public:
static SingleTon* getInstance() //静态成员方法
{
return &single;
}
private:
SingleTon(){}
SingleTon(const SingleTon&);
static SingleTon single; //静态成员变量
};
SingleTon SingleTon::single; //初始化静态成员变量 single
int main()
{
SingleTon* psing1 = SingleTon::getInstance();
SingleTon* psing2 = SingleTon::getInstance();
SingleTon* psing3 = SingleTon::getInstance();
SingleTon* psing4 = SingleTon::getInstance();
return 0;
}
//线程安全的
class SingleTon
{
public:
static SingleTon* getInstance()//双重锁机制的单例模式
{
if (psing == NULL)
{
//lock();
if (psing == NULL)
{
psing = new SingleTon();
}
//unlock();
}
return psing;
}
private:
SingleTon(){}
SingleTon(const SingleTon&);
static SingleTon* psing;
};
SingleTon* SingleTon::psing = NULL;
int main()
{
SingleTon* psing1 = SingleTon::getInstance();
SingleTon* psing2 = SingleTon::getInstance();
SingleTon* psing3 = SingleTon::getInstance();
SingleTon* psing4 = SingleTon::getInstance();
return 0;
}
函数指针:
typedef void(*PFunc)(); // PFunc 此时就表示 void(*)() 类型的函数指针
void Show()// Show函数的类型为 void (*) ()
{
std::cout << "hello world!" << std::endl;
}
int main()
{
//函数指针的使用
void(*func)() = &Show;
(*func)();
return 0;
}
class Test
{
public:
Test(int a) :ma(a){}
void Show()//thiscall
{
std::cout << ma << std::endl;
}
private:
int ma;
};
int main()
{
std::cout << typeid(&Test::Show).name() << std::endl; //typeid().name() 可打印类型
Test* ptest = new Test(30);
void(Test::*PFunc)() = &Test::Show; //void (Test::*)();
(ptest->*PFunc)();//访问函数指针用 .* 或 ->*
return 0;
}
但是双重锁机制也是有一定的问题,并不是完美无缺的:因为这种策略可能导致返回一个部分初始化的对象!因为当第一个线程进入到临界区后,语句 psing = new SingleTon(); 就会使得psing不为空 发生在对象的构造函数结束之前,而在此时可能对象还未完整的生成,但psing不为NULL,按照代码逻辑,当下一个进程到来的时候发现psing !=NULL就会直接返回刚才那个非完整的对象。