470,815 Members | 1,259 Online
Bytes | Developer Community
New Post

Home Posts Topics Members FAQ

Post your question to a community of 470,815 developers. It's quick & easy.

which constructor is used in the direct-initialization?

class A
{
public:
int x;
A(int x_=0):x(x_){}
};

int main()
{
A obj1(99); //user-defined constructor is used
A obj2=obj1; //compiler-defined copy constructor is used
A obj3(obj1); //which constructor is used ? I am surprised that
this kind of direct-initialization
//works

Thanks for your kind help !

Dec 7 '06 #1
5 2114

heng wrote:
class A
{
public:
int x;
A(int x_=0):x(x_){}
};
Why not test it?

#include <iostream>

class A {
int x;
public:
A( int n = 0 ) : x(n) { std::cout << "A(int)\n"; }
A( const A& copy )
{
std::cout << "A copy\n";
x = copy.x;
}
};
>
int main()
{
A obj1(99); //user-defined constructor is used
A obj2=obj1; //compiler-defined copy constructor is used
A obj3(obj1); //which constructor is used ? I am surprised that
this kind of direct-initialization
//works

Thanks for your kind help !
There is absolutely no difference between the following 2 statements:

A obj2 = obj1;
A obj2( obj1 );

Dec 7 '06 #2
Salt_Peter wrote:
Thanks. But you explicitly define the copy constructor in your example,
I mean, without the explicit copy constructor, which constructor is
used in the expression like

A obj2(obj1);

is it still the copy constructor?

Dec 7 '06 #3
heng wrote:
Salt_Peter wrote:
Thanks. But you explicitly define the copy constructor in your
example, I mean, without the explicit copy constructor, which
constructor is used in the expression like

A obj2(obj1);

is it still the copy constructor?
Probably. If you don't declare one, it will be declared for you,
and defined (if possible).

V
--
Please remove capital 'A's when replying by e-mail
I do not respond to top-posted replies, please don't ask
Dec 7 '06 #4

heng wrote:
Salt_Peter wrote:
Thanks. But you explicitly define the copy constructor in your example,
I mean, without the explicit copy constructor, which constructor is
used in the expression like

A obj2(obj1);

is it still the copy constructor?
Yes, the compiler must provide a copy ctor unless you explicitly
prevent it.
Otherwise, the above would generate an error.
So why not implement the copy to match your needs?

To push the logic a little further, how come the following works?

class A {
};

int main()
{
A a; // def ctor
A b(a); // copy ctor
a = b; // assignment - not a copy!!!
}

Dec 7 '06 #5
heng wrote:
class A
{
public:
int x;
A(int x_=0):x(x_){}
};

int main()
{
A obj1(99); //user-defined constructor is used
A obj2=obj1; //compiler-defined copy constructor is used
A obj3(obj1); //which constructor is used ? I am surprised that
this kind of direct-initialization
//works

Thanks for your kind help !
That is part of the definition of the language. If you do not define
your own copy constructor the compiler will create an implicit one for
you. The compiler created copy constructor performs a memberwise copy
of its subobjects.
-
Ivan
http://www.0x4849.net

Dec 7 '06 #6

This discussion thread is closed

Replies have been disabled for this discussion.

Similar topics

3 posts views Thread by Jun | last post: by
6 posts views Thread by Kutty Banerjee | last post: by
6 posts views Thread by Christoph Bartoschek | last post: by
10 posts views Thread by William Stacey | last post: by
9 posts views Thread by muzmail | last post: by
74 posts views Thread by Zytan | last post: by
By using this site, you agree to our Privacy Policy and Terms of Use.