C++类中的静态成员以及单例模式(含常见笔试⾯试题)
静态成员:类的成员变量可以被static修饰,存储位置由原来的栈或堆变成data或bss,整个程序中只存在⼀份,被所有的对象共享(静态成员属于类,⽽不是某个对象)。
静态成员变量在类中声明,但必须在类外定义、初始化,与其它在类外的成员函数⼀样,需要加 类名:: 表⽰它属于哪个类,但不需要再加static。
class Single
{
static int a;
};
int Single::a =10;
静态成员变量虽然在类外定义,但它依然受访问控制符的限制,私有成员和保护成员只能在类内访问。
静态成员变量不需要对象就可以访问,类名::静态成员变量名,public静态成员变量可以当全局变量使
⽤。
静态成员函数也可以被static修饰,这种成员参数中就没有隐藏this指针,因此静态成员函数不需要对象就可以访问,类名::静态成员函数名,也就导致静态成员函数中不访问成员变量,也不能调⽤其它成员函数。
普通成员函数中可以直接访问类的静态成员变量和静态成员函数。
静态成员的作⽤:
静态成员变量可以当作类范围内的"全局变量使⽤"。
⽽静态成员函数可以作为其它函数的回调函数,或者当作类的接⼝,实现对类的管理。
常见的⾯试:C语⾔中的static与C++的static有什么区别?
在C语⾔static具有限制作⽤域、改变存储位置、延长⽣命周期的功能。
在C++中static⼜增加了新功能,可以修饰类的成员变量和成员函数。
静态成员变量:
存储位置由原来的栈或堆变成data或bss,整个程序中只存在⼀份,被所有的对象共享。
在类⾥⾯声明,在类外定义,访问时不需要对象,依然受访问控制限定符控制,只有public可以在类外访问被当作全局变量使⽤。
静态成员函数:
没有隐藏的this指针,不需要对象就可以调⽤,不能在函数访问成员变量和成员函数,但可以被其它成员函数调⽤。
可以让类的成员函数当作回调函数,可以当作类的管理接⼝。
单例模式:只能创建出⼀个对象的类叫单例模式。
单例模式的应⽤场景:
1、Windows系统的任务管理器。
2、Linux\UNIX系统的⽇志管理系统。
3、⽹站的访问计数器。
4、服务器的连接池、线程池、数据池等。
创建单⼀对象的⽅法:
1、定义全局的,但不受控制,且有再次创建的风险。
2、专门实现⼀个类,把类的构造函数调⽤为私有,然后借助静态成员函数提供⼀个获取唯⼀对象的接⼝。
C++实现单例的思路:
1、禁⽌类外创建类对象:把构造和拷贝构造设置为私有的。
static修饰的变量2、类⾃⼰维护⼀个对象:使⽤静态指针或静态对象。
3、提供⼀个获取实例的⽅法:使⽤静态成员函数获取静态对象。
懒汉模式:
⽤静态成员指针来指向唯⼀的单例对象,只有真正调⽤单例接⼝时才创建对象。
优点:什么时候⽤什么时候创建,节约内存、资源。
缺点:只有在调⽤获取接⼝时才创建对象,当多个线程同时调⽤该接⼝时,可能会创建出多个对象,存在线程不安全问题。
饿汉模式:
将单例对象设置为类的静态成员变量,在main函数开始运⾏前,实例对象就已经创建完成。优点:获取单例对象时,线程安全。
缺点:⽆论是否使⽤,单例对象都已经创建完成,浪费内存、资源。
懒汉模式
class Single
{
static Single* a;
Single(void){}
Single(const Single& that){}
public:
static Single*func(void)
{
if(a)return a;
a =new Single;
return a;
}
};
Single* Single::a;
int main()
{
Single* s = Single::func();
}
饿汉模式
class Single
{
static Single a;
Single(void){}
Single(const Single& that){}
public:
static Single&func(void)
{
return a;
}
};
Single Single::a;
int main()
{
Single& s = Single::func();
}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论