对象的构造顺序一

对于局部对象

当程序执行流到达对象的定义语句时进行构造

例:

#include"stdio.h"
class Test
{
 private:
 int mi;
 public:
   Test(int i)
   {
    mi = i;
    printf("Test(int i):%d\n",mi);
   }
   Test(const Test& obj)
   {
    mi = obj.mi;
    printf("Test (const Test& obj):%d\n",mi);
   }
   int getmi()
   {
    return 0;
   }
};
int main()
{
    int i = 0;
    Test a1(i);
    while(i<3)
    {
        Test a2 = ++i;
    }
goto end;
        Test a(100);
  end:
  printf("a.mi = %d\n",a.mi);
    
    return 0;
}

输出:

delphi@delphi-vm:~$ g++ test.cpp
test.cpp: In function ‘int main()’:
test.cpp:32: error: jump to label ‘end’
test.cpp:30: error:   from here
test.cpp:31: error:   crosses initialization of ‘Test a’
test.cpp:5: error: ‘int Test::mi’ is private
test.cpp:33: error: within this context

对象的构造顺序二

对于堆对象

当程序执行流到达new语句时,创建对象

使用new创建对象将自动触发构造函数的调用

#include"stdio.h"
class Test
{
 private:
 int mi;
 public:
   Test(int i)
   {
    mi = i;
    printf("Test(int i):%d\n",mi);
   }
   Test(const Test& obj)
   {
    mi = obj.mi;
    printf("Test (const Test& obj):%d\n",mi);
   }
   int getmi()
   {
    return 0;
   }
};
int main()
{
    int i = 0;
    Test *a1 = new Test(i);
    while(++i<10)
    {
     if(i%2)
     {
        new Test(i);
     }
    }
    if(i<4)
    {
        new Test(*a1);
    }   
    else
    {
        Test(100);
    }
    return 0;
}

输出:

Test(int i):0
Test(int i):1
Test(int i):3
Test(int i):5
Test(int i):7
Test(int i):9
Test(int i):100

对象的构造顺序三

全局对象的构造顺序时不确定的

不同的编译器使用不同的规则确定构造顺序

小结:

局部对象的构造顺序依赖于程序的执行流

堆对象的构造顺序依赖于new的顺序使用

全局对象的构造顺序是不确定的


YingLi
6 声望4 粉丝

From zero to hero.