C+±–全局对象、局部对象、静态对象
1、全局对象,程序一开始,其构造函数就先被执行(比程序进入点更早);程序即将结束前其析构函数将被执行。
2、局部对象,当对象生成时,其构造函数被执行;当程序流程将离开该对象的声明周期时,其析构函数被执行。
3 、静态(static)对象,当对象生成时其构造函数被执行;当程序将结束时其析构函数才被执行,但比全局对象的析构函数早一步执行。
4、以new方式产生出来的局部对象,当对象生成时其构造函数被执行,析构函数则在对象被delete时执行时执行
静态全局对象和一般的全局对象的区别就是一般的全局对象在程序的其他文件中可以通过关键字extern来调用,而static声明的全局变量则只能在本文件中使用,这是链接性一个是外部的,一个是内部的!
四种不同对象生存方式(in stack、in heap、global、local static)
在C++中,有四种方法可以产生一个对象。
第一种方法是在堆栈(stack)之中产生:
第二种方法是在堆(heap)中产生:
第三种方法是产生一个全局对象
第四种方法是产生一个局部静态对象
class Test
{
public:
Test(int a, int b)
{
std::cout << this << "Test:: Test(int,int)" << std::endl;
ma = a;
mb = b;
}
Test(int a)
{
std::cout << this << "Test:: Test(int)" << std::endl;
ma = a;
}
Test()
{
std::cout << this << "Test:: Test()" << std::endl;
}
Test(const Test& rhs)
{
std::cout << this << "Test:: Test(const Test&)" << std::endl;
ma = rhs.ma;
mb = rhs.mb;
}
Test& operator=(const Test& rhs)
{
std::cout << this << "Test::operator = (const Test&)" << std::endl;
if (this != &rhs)
{
ma = rhs.ma;
mb = rhs.mb;
}
return *this;
}
~Test()
{
std::cout << this << "Test::~Test()" << std::endl;
}
int getValue()
{
return ma;
}
private:
int ma;
int mb;
};
Test gtest1(10, 20);// 声明一个全局对象,global
int main()
{
Test test2;// 声明一个局部对象,在堆栈(stack)之中
static Test test3(10, 20);// 声明一个静态局部对象,local static
Test* ptest4 = new Test(10, 20);//动态生成的局部对象,在堆(heap)中
delete ptest4;
return 0;
}