Mail Archives: djgpp/1999/10/07/01:29:23
In a previous article, weiqigao AT a DOT crl DOT com (Weiqi Gao) says:
>"Wendy E. McCaughrin" wrote:
>>
>> The following example shows that 'gxx' will not invoke a copy-ctor
>> for temporaries, only for variables.
>
>There's no need to.
>
>> #include <iostream.h>
>> #include <string.h>
>>
>> class Overflow
>> { char mssg[80];
>> public:
>> Overflow( char* ccp ) { strcpy(mssg,ccp); }
>> Overflow( const Overflow& ovfl ) // must be 'const' !
>> { cerr << "copy ctor: "; strcpy(mssg,ovfl.mssg); }
>> void Report() { cerr << mssg; }
>> };
>>
>> void TstCpy( Overflow ); // call by value
>>
>> int main()
>> { Overflow of = " I am a variable\n";
>> TstCpy(of); // passing a variable: copy-ctor invoked
>> TstCpy(Overflow(" I am a temporary\n")); // passing temp: no
>> // copy-ctor
>
>The object is constructed on TstCpy()'s stack.
Well ... not exactly :) I single-stepped through the disassembled code
via FSDB and found that the object is ctor'd on main's stack, not on
TstCpy's. The argument passed to TstCpy() is always a ptr to the temp,
in both calls: that ptr is an address in main's stack-frame.
>Remember that argument passing is like initialization. Therefore
>
> TstCpy(of);
>
>is akin to
>
> Overflow temp = of;
Correct. That is just what I would expect, so why is passing a temp
different semantics (other than efficiency)?
>
>which invokes the copy constructor, whereas
>
> TstCpy(Overflow(" I an a temporary\n"));
>
>is akin to
>
> Overflow temp = Overflow(" I an a temporary\n");
>
>which does not invoke the copy constructor, but merely constructs the
>new object at the place where temp is allocated.
>
>> return 0;
>> }
>>
>> void TstCpy(Overflow ovrflw)
>> { ovrflw.Report(); }
>>
>>
>> When compiled and run, the output is:
>>
>> copy ctor: I am a variable (indicating call of copy-ctor)
>> I am a temporary (defaults to bit-wise copy)
>
>It's not a bit-wise copy after all.
>
>--
>Weiqi Gao
>weiqigao AT a DOT crl DOT com
>
- Raw text -