Inside The C++ Object Model 读书笔记(二)——静态成员变量与单例模式
添加时间:2013-5-28 点击量:
还是关于C++对象模型,前一篇读书笔记中涉及到了静态成员变量的题目,后来发明须要思虑的器材还是有很多的,下面便一一道来。
起首,类中的static member在策画类的大小时并不策画在内,举例如下,原因是什么呢?
class X{
public:
int data;
static int num;
};
sizeof(X) = 4;
View Code
大项目组人应当知道,static member相当于是全局变量,而全局变量是存储在静态区里的,所以和类或者对象是相分别的,是以在策画sizeof(X)时就不管帐算在内。既然是static member是全局变量,那么不管法度中产生几许objects,static member永远只存在一份实例,甚至即使该类没有任何实例,其static member也可以已经存在。
第二,要接见类的静态成员,光声明是不敷的,上方的class X中只是对num的声明,若是你直接在其他函数中实例化一个对象,并用这个对象接见static member num,那么编译器会给你来上一句类似“fatal error LNK1120: 1 个无法解析的外部号令”的话。为什么呢?因为类里面的static int num只是一句声明而并非定义!若是要接见一个变量,则它必必要被定义过才行!而定义则必须在类的外部(也不克不及是其他函数内部,跟定义全局变量一样)。这里可以直接在class X的外部直接定义:int X::num = 10; 定义今后就可以直接接见了。
说到了静态成员变量的应用就不由自立的联想到单例模式的实现,下面也就简单介绍下单例模式。
单例模式(Singleton)可能是应用广泛的设计模式,目标是包管对于某个类,只能实例化一个这种类的对象,并供给一个接见它的全局接见点。很多景象下可以比对单例模式,比如一个体系中只应当有一个文件体系和一个窗口经管器,某个法度只容许产生一个交互窗口等等。一个常用的实现办法是将创建这个独一实例的操纵隐蔽在一个类操纵之中,由它包管只有一个实例被创建。这个操纵可以接见保存独一实例的变量,并且包管在未创建实例时,创建实例。下面给出一种实现:
1 class Singleton{
2 public:
3 static Singleton GetInstance();
4 int getVar();
5 void setVar(int);
6 virtual ~Singleton();
7 private:
8 static Singleton m_instance;
9 int var;
10 protected:
11 Singleton();
12 };
13
14 Singleton Singleton::m_instance=0;
15
16 Singleton::Singleton()
17 {
18 this->var = 100;
19 cout<<Singleton constructor.<<endl;
20 }
21
22 Singleton::~Singleton()
23 {
24 cout<<Singleton Destructor.<<endl;
25 }
26
27 Singleton Singleton::GetInstance()
28 {
29 if(m_instance==NULL)
30 m_instance = new Singleton();
31 return m_instance;
32 }
33
34 int Singleton::getVar()
35 {
36 return this->var;
37 }
38
39 void Singleton::setVar(int var)
40 {
41 this->var = var;
42 }
View Code
可以本身在main函数里测试getVar()和setVar()的操纵,看是否操纵的是同一个实例。
原来,再大的房子,再大的床,没有相爱的人陪伴,都只是冰冷的物质。而如果身边有爱人陪伴,即使房子小,床小,也觉得无关紧要,因为这些物质上面有了爱的温度,成了家的元素。—— 何珞《婚房》#书摘#
还是关于C++对象模型,前一篇读书笔记中涉及到了静态成员变量的题目,后来发明须要思虑的器材还是有很多的,下面便一一道来。
起首,类中的static member在策画类的大小时并不策画在内,举例如下,原因是什么呢?
class X{
public:
int data;
static int num;
};
sizeof(X) = 4;
View Code
大项目组人应当知道,static member相当于是全局变量,而全局变量是存储在静态区里的,所以和类或者对象是相分别的,是以在策画sizeof(X)时就不管帐算在内。既然是static member是全局变量,那么不管法度中产生几许objects,static member永远只存在一份实例,甚至即使该类没有任何实例,其static member也可以已经存在。
第二,要接见类的静态成员,光声明是不敷的,上方的class X中只是对num的声明,若是你直接在其他函数中实例化一个对象,并用这个对象接见static member num,那么编译器会给你来上一句类似“fatal error LNK1120: 1 个无法解析的外部号令”的话。为什么呢?因为类里面的static int num只是一句声明而并非定义!若是要接见一个变量,则它必必要被定义过才行!而定义则必须在类的外部(也不克不及是其他函数内部,跟定义全局变量一样)。这里可以直接在class X的外部直接定义:int X::num = 10; 定义今后就可以直接接见了。
说到了静态成员变量的应用就不由自立的联想到单例模式的实现,下面也就简单介绍下单例模式。
单例模式(Singleton)可能是应用广泛的设计模式,目标是包管对于某个类,只能实例化一个这种类的对象,并供给一个接见它的全局接见点。很多景象下可以比对单例模式,比如一个体系中只应当有一个文件体系和一个窗口经管器,某个法度只容许产生一个交互窗口等等。一个常用的实现办法是将创建这个独一实例的操纵隐蔽在一个类操纵之中,由它包管只有一个实例被创建。这个操纵可以接见保存独一实例的变量,并且包管在未创建实例时,创建实例。下面给出一种实现:
1 class Singleton{
2 public:
3 static Singleton GetInstance();
4 int getVar();
5 void setVar(int);
6 virtual ~Singleton();
7 private:
8 static Singleton m_instance;
9 int var;
10 protected:
11 Singleton();
12 };
13
14 Singleton Singleton::m_instance=0;
15
16 Singleton::Singleton()
17 {
18 this->var = 100;
19 cout<<Singleton constructor.<<endl;
20 }
21
22 Singleton::~Singleton()
23 {
24 cout<<Singleton Destructor.<<endl;
25 }
26
27 Singleton Singleton::GetInstance()
28 {
29 if(m_instance==NULL)
30 m_instance = new Singleton();
31 return m_instance;
32 }
33
34 int Singleton::getVar()
35 {
36 return this->var;
37 }
38
39 void Singleton::setVar(int var)
40 {
41 this->var = var;
42 }
View Code
可以本身在main函数里测试getVar()和setVar()的操纵,看是否操纵的是同一个实例。
原来,再大的房子,再大的床,没有相爱的人陪伴,都只是冰冷的物质。而如果身边有爱人陪伴,即使房子小,床小,也觉得无关紧要,因为这些物质上面有了爱的温度,成了家的元素。—— 何珞《婚房》#书摘#