请教静态成员与全局变量有什么不同
请问静态成员与全局变量有什么不同?
请问静态成员与全局变量有什么不同?
------解决方案--------------------
转一个:
我们学习C++的时候知道静态变量的特性,他不是临时变量,在编译期间就已经产成。用一个例子就能说明问题。
#include <iostream>
using namespace std;
class A{
public:
A(){ cout < < "Can you see me Now! " < < endl; }
~A(){ cout < < "I 'm Go Away! " < < endl; }
};
void TestStatic( void )
{
static A a;
}
void main()
{
cout < < "Program Start! " < < endl;
TestStatic();
TestStatic();
TestStatic();
cout < < "Program End! " < < endl;
}
结果是:
Program Start!
Can you see me Now!
Program End!
I 'm Go Away!
A a只被定义了一次,而且析构是在主程序退出以后才进行的。这说明了什么呢,A a在void TestStatic( void )是同一个实例,他存在于整个程序但是只有在void TestStatic( void )中能访问他。
不相信?那我们来试试看。
#include <iostream>
using namespace std;
class A{
private:
int count;
public:
A():count(0){ cout < < "Can you see me Now! " < < endl; }
~A(){ cout < < "I 'm Go Away! " < < endl; }
void Inc(){ count++; }
int Count(){ return count; }
};
void TestStatic( void )
{
static A a;
a.Inc();
cout < < "count 's value is : " < < a.Count() < < endl;
}
void main()
{
cout < < "Program Start! " < < endl;
TestStatic();
TestStatic();
TestStatic();
cout < < "Program End! " < < endl;
}
结果是:
Program Start!
Can you see me Now!
count 's value is : 1 //初始化count为0,Inc导致count自加值应该为1
count 's value is : 2 //没有初始化,Inc导致count自加值应该为2
count 's value is : 3 //没有初始化,Inc导致count自加值应该为3
Program End!
I 'm Go Away!
事实说明了一切,那么他是如何实现的呢,C++编译器里,他被创建在一个内存区域里,这块区域不是堆也不是栈,编译器在编译阶段就将他们记住,并为他们做好分配工作,如此一来就可以实现这个特性。
看起来他的作用有些象全局变量,但是我们知道,使用全局变量会整加模块的耦合性,降低代码的通用性,所以静态成员变量的出现为我们编程带来的灵活性。
如何将这个小东西用在我们的面向对象编程中呢。他扮演一个什么样的角色呢,这正是我要说的。
我们知道,类的成员变量表示了一个类的属性,对应着对象的物质特性,他们在类的某个实例创建的时候创建,消亡的时候消亡。但是上面说到,静态变量在编译期间就已经存在了,也就是并不随着实例创建的时候创建,消亡的时候消亡。是这样吗。看事实说话。
#include <iostream>
using namespace std;
class A{
public:
A() { cout < < "A is On! " < < endl; }
~A() { cout < < "A is OFF! " < < endl; }
};
class B{
public:
B() { cout < < "B is On! " < < endl; }
~B() { cout < < "B is OFF! " < < endl; }
private:
static A a;
};
A B::a;
void main()
{
cout < < "Program Start! " < < endl;
B b1,b2,b3;
cout < < "Program End! " < < endl;
}
结果是:
A is On! //瞧我又说中了,主程序还没有运行,构造函数就开始工作了,这时B的实例还没有登场
请问静态成员与全局变量有什么不同?
------解决方案--------------------
转一个:
我们学习C++的时候知道静态变量的特性,他不是临时变量,在编译期间就已经产成。用一个例子就能说明问题。
#include <iostream>
using namespace std;
class A{
public:
A(){ cout < < "Can you see me Now! " < < endl; }
~A(){ cout < < "I 'm Go Away! " < < endl; }
};
void TestStatic( void )
{
static A a;
}
void main()
{
cout < < "Program Start! " < < endl;
TestStatic();
TestStatic();
TestStatic();
cout < < "Program End! " < < endl;
}
结果是:
Program Start!
Can you see me Now!
Program End!
I 'm Go Away!
A a只被定义了一次,而且析构是在主程序退出以后才进行的。这说明了什么呢,A a在void TestStatic( void )是同一个实例,他存在于整个程序但是只有在void TestStatic( void )中能访问他。
不相信?那我们来试试看。
#include <iostream>
using namespace std;
class A{
private:
int count;
public:
A():count(0){ cout < < "Can you see me Now! " < < endl; }
~A(){ cout < < "I 'm Go Away! " < < endl; }
void Inc(){ count++; }
int Count(){ return count; }
};
void TestStatic( void )
{
static A a;
a.Inc();
cout < < "count 's value is : " < < a.Count() < < endl;
}
void main()
{
cout < < "Program Start! " < < endl;
TestStatic();
TestStatic();
TestStatic();
cout < < "Program End! " < < endl;
}
结果是:
Program Start!
Can you see me Now!
count 's value is : 1 //初始化count为0,Inc导致count自加值应该为1
count 's value is : 2 //没有初始化,Inc导致count自加值应该为2
count 's value is : 3 //没有初始化,Inc导致count自加值应该为3
Program End!
I 'm Go Away!
事实说明了一切,那么他是如何实现的呢,C++编译器里,他被创建在一个内存区域里,这块区域不是堆也不是栈,编译器在编译阶段就将他们记住,并为他们做好分配工作,如此一来就可以实现这个特性。
看起来他的作用有些象全局变量,但是我们知道,使用全局变量会整加模块的耦合性,降低代码的通用性,所以静态成员变量的出现为我们编程带来的灵活性。
如何将这个小东西用在我们的面向对象编程中呢。他扮演一个什么样的角色呢,这正是我要说的。
我们知道,类的成员变量表示了一个类的属性,对应着对象的物质特性,他们在类的某个实例创建的时候创建,消亡的时候消亡。但是上面说到,静态变量在编译期间就已经存在了,也就是并不随着实例创建的时候创建,消亡的时候消亡。是这样吗。看事实说话。
#include <iostream>
using namespace std;
class A{
public:
A() { cout < < "A is On! " < < endl; }
~A() { cout < < "A is OFF! " < < endl; }
};
class B{
public:
B() { cout < < "B is On! " < < endl; }
~B() { cout < < "B is OFF! " < < endl; }
private:
static A a;
};
A B::a;
void main()
{
cout < < "Program Start! " < < endl;
B b1,b2,b3;
cout < < "Program End! " < < endl;
}
结果是:
A is On! //瞧我又说中了,主程序还没有运行,构造函数就开始工作了,这时B的实例还没有登场