Mail Archives: djgpp/1999/10/02/00:03:13
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. Remember that argument
>passing is like initialization. Therefore
>
> TstCpy(of);
>
>is akin to
>
> Overflow temp = of;
>
>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.
>
2 questions:
1. Your reference for the above assertion?
2. You say that the new object is merely constructed at the place
where temp is allocated -- how is this different from bit-wise
copy? By "construct" do you mean the char* ctor is invoked to
build 'temp' -- then I agree it is not bit-wise copy. But you
express it like assignment, which defaults to bit-wise copy.
>--
>Weiqi Gao
>weiqigao AT a DOT crl DOT com
>
- Raw text -