|
二,类型转换生成的临时对象。 我们在做类型转换时,转换后的对象通常是一个临时对象。编译器为了通过编译会创建一起我们不易察觉的临时对象。再次修改如上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预留的空间中进行的。因此也减少了一次临时对象的创建。 |