C++的临时对象(二)

2011-12-28 12:57:56 · 作者: · 浏览: 1851
   二,类型转换生成的临时对象。
  我们在做类型转换时,转换后的对象通常是一个临时对象。编译器为了通过编译会创建一起我们不易察觉的临时对象。再次修改如上main代码:
  void main()
  { CTemp tm(10,20),sum;
  sum = 1000;
  printf("Sum = %d n",tm.GetSum(sum));
  } -----------------------------------------------------------
  Output:
  Construct function!
  a = 10
  b = 20
  Construct function!
  a = 0
  b = 0
  Construct function!
  a = 1000
  b = 0
  Sum = 1000
  ----------------------------------------------------------
  main函数创建了两个对象,但输出却调用了三次构造函数,这是为什么呢
  关键在 sum = 1000;这段代码。本身1000和sum类型不符,但编译器为了通过编译以1000为参调用构造函数创建了一下临时对象。
  解决办法:
  我们对main函数中的代码稍作修改,将sum申明推迟到“=”号之前:
  void main()
  { CTemp tm(10,20);
  CTemp sum = 1000;
  printf("Sum = %d n",tm.GetSum(sum));
  } ----------------------------------------------------------
  Output:
  Construct function!
  a = 10
  b = 20
  Construct function!
  a = 1000
  b = 0
  Sum = 1000
  ----------------------------------------------------------
  只作了稍稍改动,就减少了一次临时对象的创建。
  1,此时的“=”号由原本的赋值变为了构造。
  2,对Sum的构造推迟了。当我们定义CTmep sum时,在main的栈中为sum对象创建了一个预留的空间。而我们用1000调用构造时,此时的构造是在为sum预留的空间中进行的。因此也减少了一次临时对象的创建。