473,378 Members | 1,209 Online
Bytes | Software Development & Data Engineering Community
Post Job

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 473,378 software developers and data experts.

C++: Default Copy Constructor

A
Hi,

A default copy constructor is created for you when you don't specify one
yourself. In such case, the default copy constructor will simply do a
bitwise copy for primitives (including pointers) and for objects types call
their default constructor.

Any others points i should know?
Regards,
A

Jul 22 '05 #1
15 21154


A wrote:

Hi,

A default copy constructor is created for you when you don't specify one
yourself. In such case, the default copy constructor will simply do a
bitwise copy for primitives (including pointers) and for objects types call
their default constructor.


That would be silly.
Of course it uses the copy constructor for object types.

--
Karl Heinz Buchegger
kb******@gascad.at
Jul 22 '05 #2
> A default copy constructor is created for you when you don't specify one
yourself. In such case, the default copy constructor will simply do a
bitwise copy for primitives (including pointers) and for objects types call their default constructor.


Why think of it that way? Aside from it being incorrect, I mean.

If you got at explanation from a book, I suggest you avoid that book in the
future.

The default copy constructor for a class copies the (non-static) data
members of the class. Exactly what it means to copy the member depends on
the member's type, just as the meaning of copying any object depends on the
object's type.
Jul 22 '05 #3
Andrew Koenig writes:
A default copy constructor is created for you when you don't specify one
yourself. In such case, the default copy constructor will simply do a
bitwise copy for primitives (including pointers) and for objects types call
their default constructor.


Why think of it that way? Aside from it being incorrect, I mean.

If you got at explanation from a book, I suggest you avoid that book in

the future.


I rarely pile on during "bad book" crusades. But I will make an exception
for that book. Sometimes there is an innocuous statement that is wrong in a
pedant's eyes but harmless; there is no way I could construe that as
harmless.
Jul 22 '05 #4

"A" <A@iprimus.com.au> wrote in message news:3f********@news.iprimus.com.au...
Hi,

A default copy constructor is created for you when you don't specify one
yourself. In such case, the default copy constructor will simply do a
bitwise copy for primitives (including pointers) and for objects types call
their default constructor.


Default copy constructor is a bit confusing terminology. I prefer "implicitly
defined" or "compiler generated' constructor.

The implicitly defined copy constructor invokes the copy constructor (not
the default) to copy all the subobjects.

Jul 22 '05 #5
"A" <A@iprimus.com.au> wrote in message news:<3f********@news.iprimus.com.au>...
Hi,
Hello
A default copy constructor is created for you when you don't specify one
yourself. In such case, the default copy constructor will simply do a
bitwise copy for primitives (including pointers) and for objects types call
their default constructor.
There is no such thing as a default copy constructor. There are
default constructors and copy constructors and they are different
things.

The implicitly defined copy constructor (which I think is what you
mean by "default copy constructor") will copy non-static members of
class type using their copy constructor, not their default
constructor. The implicitly defined copy constructor is used when you
don't define your own copy constructor.
Any others points i should know?


Undoubtedly :) But it would help if you were a bit more specific. Have
you come across some code you can't figure out, or a passage in a text
book you don't understand?

GJD
Jul 22 '05 #6
Why isn't the copy for primitives called a bytewise copy instead of a
bitwise copy?
Joe Hesse

"A" <A@iprimus.com.au> wrote in message
news:3f********@news.iprimus.com.au...
Hi,

A default copy constructor is created for you when you don't specify one
yourself. In such case, the default copy constructor will simply do a
bitwise copy for primitives (including pointers) and for objects types call their default constructor.

Any others points i should know?
Regards,
A

Jul 22 '05 #7
"Joe Hesse" <jo*******@actcx.com> wrote...
Why isn't the copy for primitives called a bytewise copy instead of a
bitwise copy?
If by "primitives" you (and "A") mean "members", then it's called
"member-wise" copy. Every member is copied using its copy c-tor
(and if it's a built-in type, like a pointer), using the built-in
mechanism of copy-initialisation.
Joe Hesse

"A" <A@iprimus.com.au> wrote in message
news:3f********@news.iprimus.com.au...
Hi,

A default copy constructor is created for you when you don't specify one
yourself. In such case, the default copy constructor will simply do a
bitwise copy for primitives (including pointers) and for objects types

call
their default constructor.

Any others points i should know?
Regards,
A


Jul 22 '05 #8

"Joe Hesse" <jo*******@actcx.com> wrote in message news:3f***********************@newsreader.visi.com ...
Why isn't the copy for primitives called a bytewise copy instead of a
bitwise copy?

I'm not sure why it's called either one. Each subobject is copied according
to its own copy semantics, be it via copy constructor or by some internal
means. Most implementations copy things in bigger increments than bits
OR bytes when necesssary.
Jul 22 '05 #9
A
Hi,

A default copy constructor is created for you when you don't specify one
yourself. In such case, the default copy constructor will simply do a
bitwise copy for primitives (including pointers) and for objects types call their default constructor.

Any others points i should know?
Regards,
A


Firstly, i would like to point out that a default copy constructor is just
another name for the implicitly defined copy constructor that is created for
you when you do not explicitly specify one yourself.

It seems that I have confused a few people with my inaccurate statement, so
I will make the following amendments:

A default copy constructor is created for you when you don't specify one
yourself. In such case, the default copy constructor will simply do a
bitwise copy for primitives (including pointers) and for objects types call
their copy constructor. If in the later case, a copy constructor is not
explicitly defined then, in turn, a default copy constructor will be
implicitly created.

I believe this is ROCK SOLID now!
Regards,
A

---
Outgoing mail is certified Virus Free.
Checked by AVG anti-virus system (http://www.grisoft.com).
Version: 6.0.538 / Virus Database: 333 - Release Date: 10/11/2003
Jul 22 '05 #10


A wrote:
Hi,

A default copy constructor is created for you when you don't specify one
yourself. In such case, the default copy constructor will simply do a
bitwise copy for primitives (including pointers) and for objects types

call
their default constructor.

Any others points i should know?
Regards,
A


Firstly, i would like to point out that a default copy constructor is just
another name for the implicitly defined copy constructor that is created for
you when you do not explicitly specify one yourself.

It seems that I have confused a few people with my inaccurate statement, so
I will make the following amendments:

A default copy constructor is created for you when you don't specify one
yourself. In such case, the default copy constructor will simply do a
bitwise copy for primitives (including pointers) and for objects types call
their copy constructor. If in the later case, a copy constructor is not
explicitly defined then, in turn, a default copy constructor will be
implicitly created.

I believe this is ROCK SOLID now!


not really.
It is not consistent with the use of the word 'default' in conjunction
with the word 'constructor'.

A default constructor is a constructor which can be called without
specifying arguments.

Thus

C::C(); is a default constructor
C::C( int i = 0 ); is a default constructor
C::C( in j ); is *not* a default constructor, because it can only
be used if some argument is specified.

So the meaning of 'default' in the context of constructors has nothing to do
with who created the function, either the programmer or the compiler. It has
to do with beeing able to be called without arguments.

That's why there is no 'default copy constructor', because a copy constructor
per definition has to be called with an argument: the object to make a copy from.

Also: replace the action a compiler generated copy constructor does with:

... the compiler generated copy constructor does a member wise copy of
its members. For builtin types (including pointers) this means a bitwise
copy. For other types the copy constructor of the member is used.

It is not the constructor which decides how this copy should be done. It
is the member which decides this.

Drop the last sentence ( "If in the later case, .... " ), it is not needed
and follows from the beginning of your paragraph ( "A default copy constructor
is cretaed for you when ..." ).
The compiler will always generate a cctor if none is specified, if it
needs one. This does include but is not restricted to: if used in another
constructor.

--
Karl Heinz Buchegger
kb******@gascad.at
Jul 22 '05 #11
"A" <A@iprimus.com.au> wrote in message news:<3f********@news.iprimus.com.au>...
Hi,

A default copy constructor is created for you when you don't specify one
yourself. In such case, the default copy constructor will simply do a
bitwise copy for primitives (including pointers) and for objects types call
their default constructor.

Any others points i should know?
Regards,
A


Firstly, i would like to point out that a default copy constructor is just
another name for the implicitly defined copy constructor that is created for
you when you do not explicitly specify one yourself.


It's not a very good alternative name. Where did you get it from?
It seems that I have confused a few people with my inaccurate statement, so
I will make the following amendments:
You run the risk of continuing to confuse people if you don't change
the phrase "default copy constructor"
A default copy constructor is created for you when you don't specify one
yourself. In such case, the default copy constructor will simply do a
bitwise copy for primitives (including pointers) and for objects types call
their copy constructor. If in the later case, a copy constructor is not
explicitly defined then, in turn, a default copy constructor will be
implicitly created.


Better than the original, but Karl Heinz Buchegger's points are well
worth taking note of.

GJD
Jul 22 '05 #12
A

Hi,

A default copy constructor is created for you when you don't specify one
yourself. In such case, the default copy constructor will simply do a
bitwise copy for primitives (including pointers) and for objects types call
their default constructor.

Any others points i should know?
Regards,
A


Firstly, i would like to point out that a default copy constructor is just
another name for the implicitly defined copy constructor that is created

for you when you do not explicitly specify one yourself.

It seems that I have confused a few people with my inaccurate statement, so I will make the following amendments:

A default copy constructor is created for you when you don't specify one
yourself. In such case, the default copy constructor will simply do a
bitwise copy for primitives (including pointers) and for objects types call their copy constructor. If in the later case, a copy constructor is not
explicitly defined then, in turn, a default copy constructor will be
implicitly created.

I believe this is ROCK SOLID now!


After further reading, it seems I may have still confused people. Let me
clarify once again.

Edit: An implicit copy constructor is created for you when you don't specify
one yourself. In such case, the implicit copy constructor will simply do a
bitwise copy for primitives (including pointers) and for objects types call
their copy constructor. If in the later case, a copy constructor is not
explicitly defined then, in turn, an implicit copy constructor will be
created.
Regards,
A
Jul 22 '05 #13
"A" <A@iprimus.com.au> wrote in message news:<3f**********@news.iprimus.com.au>...

<snip>
After further reading, it seems I may have still confused people. Let me
clarify once again.

Edit: An implicit copy constructor is created for you when you don't specify
one yourself. In such case, the implicit copy constructor will simply do a
bitwise copy for primitives (including pointers) and for objects types call
their copy constructor. If in the later case, a copy constructor is not
explicitly defined then, in turn, an implicit copy constructor will be
created.


I think that's cleared up the confusion. The last sentence isn't
strictly necessary as it logically follows from the first sentence.
But it does no harm and may help to clarify things for the reader.

There is just one technical nit to pick though (not related to the
original confusion). In the last sentence, change "defined" to
"declared". You could change "specify" to "declare" in the first
sentence too.

Whether the compiler is allowed use the implicit copy constructor
depends on whether you have _declared_ one yourself, not on whether
you have _defined_ one. So this class

class C
{
public:
C() {}

private:
C(const C& rhs); // no definition provided for
// this copy ctor.
};

can not be copied. A copy constructor is explicitly declared (though
it's not defined anywhere) so when the compiler encounters

void f()
{
C c1; // OK, used default constructor
C c2(c1); // Error
}

it can not use the implicit copy constructor on the error line because
there is a copy constructor declared in the class

hth ;-)
GJD
Jul 22 '05 #14
A
Edit: An implicit copy constructor is created for you when you don't specify one yourself. In such case, the implicit copy constructor will simply do a bitwise copy for primitives (including pointers) and for objects types call their copy constructor. If in the later case, a copy constructor is not
explicitly defined then, in turn, an implicit copy constructor will be
created.


I think that's cleared up the confusion. The last sentence isn't
strictly necessary as it logically follows from the first sentence.
But it does no harm and may help to clarify things for the reader.

There is just one technical nit to pick though (not related to the
original confusion). In the last sentence, change "defined" to
"declared". You could change "specify" to "declare" in the first
sentence too.

Whether the compiler is allowed use the implicit copy constructor
depends on whether you have _declared_ one yourself, not on whether
you have _defined_ one. So this class

class C
{
public:
C() {}

private:
C(const C& rhs); // no definition provided for
// this copy ctor.
};

can not be copied. A copy constructor is explicitly declared (though
it's not defined anywhere) so when the compiler encounters

void f()
{
C c1; // OK, used default constructor
C c2(c1); // Error
}

it can not use the implicit copy constructor on the error line because
there is a copy constructor declared in the class

hth ;-)
GJD


point taken.

Edit: An implicit copy constructor is created for you when you don't declare
one yourself. In such case, the implicit copy constructor will simply do a
bitwise copy for primitives (including pointers) and for objects types call
their copy constructor. If in the later case, a copy constructor is not
explicitly declared then, in turn, an implicit copy constructor will be
created.

Regards,
A
---
Outgoing mail is certified Virus Free.
Checked by AVG anti-virus system (http://www.grisoft.com).
Version: 6.0.538 / Virus Database: 333 - Release Date: 10/11/2003
Jul 22 '05 #15
"A" <A@iprimus.com.au> wrote in message news:<3f********@news.iprimus.com.au>...
Edit: An implicit copy constructor is created for you when you don't specify one yourself. In such case, the implicit copy constructor will simply do a bitwise copy for primitives (including pointers) and for objects types call their copy constructor. If in the later case, a copy constructor is not
explicitly defined then, in turn, an implicit copy constructor will be
created.
I think that's cleared up the confusion. The last sentence isn't
strictly necessary as it logically follows from the first sentence.
But it does no harm and may help to clarify things for the reader.

There is just one technical nit to pick though (not related to the
original confusion). In the last sentence, change "defined" to
"declared". You could change "specify" to "declare" in the first
sentence too.

Whether the compiler is allowed use the implicit copy constructor
depends on whether you have _declared_ one yourself, not on whether
you have _defined_ one.


<snip>
point taken.

Edit: An implicit copy constructor is created for you when you don't declare
one yourself. In such case, the implicit copy constructor will simply do a
bitwise copy for primitives (including pointers) and for objects types call
their copy constructor. If in the later case, a copy constructor is not
explicitly declared then, in turn, an implicit copy constructor will be
created.

Regards,
A


I'd go with that.

GJD
Jul 22 '05 #16

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

12
by: Marcelo Pinto | last post by:
Hi all, In practice, what is the diference between a default constructor and an explicit default constructor? class Ai { public: Ai() {} };
22
by: sujilc | last post by:
This question seems to be silly. Can ony one figure out the default functions implemented by compiler when we decalre a class like class A { } According to me this declaration will define...
74
by: Zytan | last post by:
I have a struct constructor to initialize all of my private (or public readonly) fields. There still exists the default constructor that sets them all to zero. Is there a way to remove the...
23
by: Jess | last post by:
Hello, I understand the default-initialization happens if we don't initialize an object explicitly. I think for an object of a class type, the value is determined by the constructor, and for...
4
by: Jess | last post by:
Hello, I tried several books to find out the details of object initialization. Unfortunately, I'm still confused by two specific concepts, namely default-initialization and...
43
by: JohnQ | last post by:
Are a default constructor, destructor, copy constructor and assignment operator generated by the compiler for a struct if they are not explicitely defined? I think the answer is yes, because...
3
by: subramanian100in | last post by:
If we provide any ctor for a class the compiler does not supply the default ctor. However if we do not provide the copy ctor but provide any other ctor, the compiler still supplies the copy ctor....
10
by: JosephLee | last post by:
In Inside C++ object Model, Lippman said there are four cases in which compile will sythesize a default constructor to initialize the member variables if the constructor is absent: 1. there is a...
9
by: puzzlecracker | last post by:
From my understanding, if you declare any sort of constructors, (excluding copy ctor), the default will not be included by default. Is this correct? class Foo{ public: Foo(int); // no...
1
by: CloudSolutions | last post by:
Introduction: For many beginners and individual users, requiring a credit card and email registration may pose a barrier when starting to use cloud servers. However, some cloud server providers now...
0
by: Faith0G | last post by:
I am starting a new it consulting business and it's been a while since I setup a new website. Is wordpress still the best web based software for hosting a 5 page website? The webpages will be...
0
isladogs
by: isladogs | last post by:
The next Access Europe User Group meeting will be on Wednesday 3 Apr 2024 starting at 18:00 UK time (6PM UTC+1) and finishing by 19:30 (7.30PM). In this session, we are pleased to welcome former...
0
by: ryjfgjl | last post by:
In our work, we often need to import Excel data into databases (such as MySQL, SQL Server, Oracle) for data analysis and processing. Usually, we use database tools like Navicat or the Excel import...
0
by: taylorcarr | last post by:
A Canon printer is a smart device known for being advanced, efficient, and reliable. It is designed for home, office, and hybrid workspace use and can also be used for a variety of purposes. However,...
0
by: Charles Arthur | last post by:
How do i turn on java script on a villaon, callus and itel keypad mobile phone
0
by: aa123db | last post by:
Variable and constants Use var or let for variables and const fror constants. Var foo ='bar'; Let foo ='bar';const baz ='bar'; Functions function $name$ ($parameters$) { } ...
0
by: emmanuelkatto | last post by:
Hi All, I am Emmanuel katto from Uganda. I want to ask what challenges you've faced while migrating a website to cloud. Please let me know. Thanks! Emmanuel
0
BarryA
by: BarryA | last post by:
What are the essential steps and strategies outlined in the Data Structures and Algorithms (DSA) roadmap for aspiring data scientists? How can individuals effectively utilize this roadmap to progress...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.