473,387 Members | 1,574 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,387 software developers and data experts.

conditions for automatic generation of default ctor, copy ctor,and default assignment operator (operator)

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 Foo() is included, i believe.
};

Under which conditions a default copy ctor and default assignment
operator are not included?
Thanks.

Jun 27 '08 #1
9 2863
"puzzlecracker" <ir*********@gmail.comwrote in message
From my understanding, if you declare any sort of constructors,
(excluding copy ctor), the default will not be included by default. Is
this correct?
No, even declaring/defining an explicit copy c'tor would restrict compiler
from generating a default constructor.
class Foo{
public:
Foo(int); // no Foo() is included, i believe.
No default constructor would be generated in this case. Default assignment
operator won't be affected.
};

--
http://techytalk.googlepages.com
Jun 27 '08 #2
No, even declaring/defining an explicit copy c'tor would restrict compiler
from generating a default constructor.
What about the reverse - Will declaring an explicit default ctor,
cause a class to generate a default copy constructor?
How is assignment affected? Say we generate an overload version of
assignment operator, will a default be included in the class?
Thanks
Jun 27 '08 #3


"puzzlecracker" <ir*********@gmail.comwrote in message
>
>No, even declaring/defining an explicit copy c'tor would restrict
compiler
from generating a default constructor.

What about the reverse - Will declaring an explicit default ctor,
cause a class to generate a default copy constructor?
Yes. Just from compilation perspectives it should be fine (Try it without
defining it).
How is assignment affected? Say we generate an overload version of
assignment operator, will a default be included in the class?
Yes
--
http://techytalk.googlepages.com
Jun 27 '08 #4
puzzlecracker wrote:
>No, even declaring/defining an explicit copy c'tor would restrict compiler
from generating a default constructor.

What about the reverse - Will declaring an explicit default ctor,
By "explicit" here you probably mean "user-declared". The term
"explicit" has a certain specific meaning when applied to constructors
in C++, you know...
cause a class to generate a default copy constructor?
Again, a problem with terminology. There's no such thing as "default
copy constructor". There's the default constructor. And there's the copy
constructor. Both can be ether user-declared or compiler-declared.

I assume your question is about the compiler-declared copy constructor.
Providing a user-declared default constructor will not really "cause"
anything to happen to compiler-declared copy constructor, i.e. it will
not prevent the compiler from declaring the copy constructor in
situations when you don't declare it yourself.
How is assignment affected? Say we generate an overload version of
assignment operator, will a default be included in the class?
Yes. Regardless of what other assignment operators you might declare, if
you don't declare the copy assignment operator, the compiler will
declare one for you.

--
Best regards,
Andrey Tarasevich
Jun 27 '08 #5
On Apr 14, 6:16 pm, puzzlecracker <ironsel2...@gmail.comwrote:
From my understanding, if you declare any sort of
constructors, (excluding copy ctor), the default will not be
included by default. Is this correct?
No. Any user defined constructor, including a copy constructor,
inhibits automatic generation of the default constructor.
class Foo{
public:
Foo(int); // no Foo() is included, i believe.

};
Under which conditions a default copy ctor and default
assignment operator are not included?
A copy constructor is generated any time there is no user
declared copy construtor. A copy assignment operator is
generated any time there is no user declared copy assignment
operator. A copy constructor for a class X is a non-template
constructor having an X&, X const&, X volatile& or X const
volatile& as its first parameter, and having default arguments
for all other parameters, if any. A copy assignment operator is
a non-template assignment operator having an X, X&, X const&, X
volatile& or X const volatile& as parameter. Note that:

-- a member function template template is never considered a
copy constructor or copy assignment operator (and thus will
never prevent the compiler from generating one);

-- you can declare more than one copy constructor or copy
assignment operator; and

-- operator overload resolution is *always* used when deciding
what constructor to call, even when "copying", and operator
overload resolution can choose a constructor which is not a
copy constructor to copy.

Consider:

class C
{
public:
template< typename T >
C( T& other ) ;
} ;

The compiler will generate a C::C( C const& ) copy constructor,
which will participate in operator overload resolution:

C c1 ;
C c2( c1 ) ; // calls the template constructor.
C c3( C() ) ; // calls the compiler generated copy
// constructor.

--
James Kanze (GABI Software) email:ja*********@gmail.com
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
Jun 27 '08 #6
On 2008-04-15 05:18:40 -0400, James Kanze <ja*********@gmail.comsaid:
On Apr 14, 6:16 pm, puzzlecracker <ironsel2...@gmail.comwrote:
>From my understanding, if you declare any sort of
constructors, (excluding copy ctor), the default will not be
included by default. Is this correct?

No. Any user defined constructor, including a copy constructor,
inhibits automatic generation of the default constructor.
Longer term, i.e. when C++0x is finalized, the solution to this problem
will be to tell the compiler to generate the default constructor
despite the existence of other constructors.

struct foo {
foo() = default;
foo(const foo&);
};

You'll also be able to tell the compiler not to generate a default constructor:

struct foo {
foo() = delete;
};

These modifiers will be applicable to all of the special member functions.

And before anyone asks: I don't know whether any compiler currently
implements this.

--
Pete
Roundhouse Consulting, Ltd. (www.versatilecoding.com) Author of "The
Standard C++ Library Extensions: a Tutorial and Reference
(www.petebecker.com/tr1book)

Jun 27 '08 #7
>
class C
{
public:
template< typename T >
C( T& other ) ;
} ;
C c1 ;
C c2( c1 ) ; // calls the template constructor.
C c3( C() ) ; // calls the compiler generated copy
// constructor.
That's interesting, I didn't know template copy ctor that takes non-
const, supersedes non-template ctor that take const type, when user
passes const type
Jun 27 '08 #8
sasha wrote:
> class C
{
public:
template< typename T >
C( T& other ) ;
} ;
C c1 ;
C c2( c1 ) ; // calls the template constructor.
C c3( C() ) ; // calls the compiler generated copy
// constructor.

That's interesting, I didn't know template copy ctor that takes non-
const, supersedes non-template ctor that take const type, when user
passes const type
Sorry, but what you said doesn't seem to make much sense.

Firstly, there's no const type in this example.

Secondly, when user does actually use an initializer of const type, the
constructor that takes a non-const reference will not even qualify as a
viable function. So no, it will not supersede anything. The behavior
will be exactly opposite of what you said.

How did you manage to derive these strange conclusions from the previous
post from James is a mystery to me.

--
Best regards,
Andrey Tarasevich
Jun 27 '08 #9
On 15 avr, 19:10, sasha <aborovin...@gmail.comwrote:
class C
{
public:
template< typename T >
C( T& other ) ;
} ;
C c1 ;
C c2( c1 ) ; // calls the template constructor.
C c3( C() ) ; // calls the compiler generated copy
// constructor.
That's interesting, I didn't know template copy ctor that
takes non- const, supersedes non-template ctor that take const
type, when user passes const type
I don't understand your reasoning. There's not a single const
object in my example. The template constructor is chosen when
the argument is a non-const lvalue, because the instantiation of
the template (C::C(C&)) is a better match. The compiler
generated copy constructor has the signature C::C( C const& )
(in this case), and will be called when the argument is const,
or isn't an lvalue---both case in which the template constructor
couldn't be called.

Note that the compiler generated copy constructor doesn't always
take a const reference---if the class contains a member or has a
base whose copy constructor (user provided) takes a non-const
reference, the the compiler generated copy constructor will also
take a non-const reference. Such cases are (hopefully) rare,
however.

--
James Kanze (GABI Software) email:ja*********@gmail.com
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
Jun 27 '08 #10

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

Similar topics

3
by: Bob | last post by:
Hi, If a class contains only built-in types and standard library objects such as strings and vectors, is it safe to let the compiler create the copy constructor and assignment operator, or is it...
1
by: Tony Johansson | last post by:
This class template and main works perfectly fine. But could be better. I have this class template called Handle that has a pointer declared as T* body; As you can see I have a reference counter...
9
by: Peter Oliphant | last post by:
I've been told that value structs can have default constructors (I'm using VS C++.NET 2005 PRO using clr:/pure syntax). But the following code generates the following error: value struct...
5
by: Diwa | last post by:
Does the "value" type (value as in key-value pair )of "std::map" require a default ctor even if it is not used ? If I comment out Line 1 in the code attached later, i.e remove the default ctor...
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....
15
by: subramanian100in | last post by:
consider the following program: #include <iostream> using namespace std; class Test { public: Test(int xx) : x(xx) { cout << x << endl; }
34
by: =?ISO-8859-1?Q?Marcel_M=FCller?= | last post by:
Hi, is there a way to avoid the automatic copy constructor generation. I do not want the object to be non-copyable. I simply do not want that copying is done by the default copy constructor. But...
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: ryjfgjl | last post by:
If we have dozens or hundreds of excel to import into the database, if we use the excel import function provided by database editors such as navicat, it will be extremely tedious and time-consuming...
0
by: ryjfgjl | last post by:
In our work, we often receive Excel tables with data in the same format. If we want to analyze these data, it can be difficult to analyze them because the data is spread across multiple Excel files...
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
1
by: nemocccc | last post by:
hello, everyone, I want to develop a software for my android phone for daily needs, any suggestions?
0
marktang
by: marktang | last post by:
ONU (Optical Network Unit) is one of the key components for providing high-speed Internet services. Its primary function is to act as an endpoint device located at the user's premises. However,...
0
Oralloy
by: Oralloy | last post by:
Hello folks, I am unable to find appropriate documentation on the type promotion of bit-fields when using the generalised comparison operator "<=>". The problem is that using the GNU compilers,...
0
jinu1996
by: jinu1996 | last post by:
In today's digital age, having a compelling online presence is paramount for businesses aiming to thrive in a competitive landscape. At the heart of this digital strategy lies an intricately woven...

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.