Mail Archives: djgpp/1999/10/02/01:56:51
In a previous article, wemccaug AT prairienet DOT org (Wendy E. McCaughrin) says:
>
>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.
>
I might add the following from the ARM (Section 5.2.2 Function Call):
"When a function is called, each formal argument is initialized with
its actual argument."
(Where Stroustrup says "formal argument", I have said "parameter" above)
The word "assignment" does not appear in this statement.
I tried operator= earlier, but it was never invoked for passing anything.
- Raw text -