As many C++ textbooks say, “if a class is defined and no constructor is provided, the compiler will implicitly provide a default constructor.”
the following excerpt from the original document of ISO C++ 99:
The default constructor (12.1), copy constructor and copy assignment operator (12.8), and destructor (12.4)
are special member functions. The implementation will
implicitly declare these member functions for a
class type
1. When the program does not declare explicitly them, except as noted in 12.1
will
implicitly define them
If they are used, as specified in 12.1, 12.4 and 12.8.
A default constructor for a class X is a constructor of class X that can be called without an argument. If
there is no user-declared constructor for class X, a default constructor is
implicitly declared. An implicitly-
declared default constructor is an
inline public member of its class.
An implicitly-declared default constructor for a class is
implicitly defined when
it is used to create an object
Declared -defined default constructor, everyone The set of Initializations of The
class that would be performed by a user-written default constructor for that class with
An Empty Meminitial-List (12.6.2) and an Empty Function body. If that user-written default constructor would be illformed,the program is ill-formed. Before the declared -declared default constructor for a class is implicitly
defined, all the implicitly-declared default constructors for its base classes and its nonstatic data members
shall have been implicitly defined. [Note: an implicitly-declared default constructor has an exceptionspecification(15.4).
the following excerpts from “corrigendum to sun xin vc tutorial” :
I said, “C++ also states that if a class does not provide any constructors, then C++ provides a default constructor (provided by the C++ compiler).” this statement is also incorrect, and correct:
If no constructor is defined in a class, the compiler will provide a default constructor only if:
1. If the class has virtual member functions or virtual inheritance parent class (i.e., virtual base class);
2. If the base class of the class has a constructor (either a user-defined constructor or a default constructor provided by the compiler);
3. All non-static object data members in a class that have constructors in their corresponding class (either user-defined constructors or default constructors provided by the compiler).
There are also such words in C++ Primer 14.2:
new users often mistakenly assume that if a default constructor does not exist, the compiler automatically generates a default construct
builds functions and applies them to objects to initialize the data members of the class, for the Account class we define
is not true, and the system neither generates the default constructor nor calls it. For those that contain a class data member or inheritance
The
more complex class, which is partially true, may generate a default constructor, but it will not be built-in or complex
Data members of the
combination, such as Pointers or arrays, provide an initial value.
can also be analyzed from the bottom layer:
C/C++ code
-
class
A
{
public
:
int
a;
char
*
ptr;
};
int
main()
{
A a;
return
0
;
}
The
code does not produce the default ctor, so the class looks like a struct under C, and none of the members need to be initialized.
evidence 1:
Assembly code
-
97
:
int
main()
98
: {
0040D680
push
ebp
0040D681
mov
ebp,esp
0040D683
sub
esp,48h
0040D686
push
ebx
0040D687
push
esi
0040D688
push
edi
0040D689
lea
edi,[ebp-48h]
0040D68C
mov
ecx,12h
0040D691
mov
eax,0CCCCCCCCh
0040D696
rep
stos dword ptr [edi]
99
: A a
;
//Nothing to do
100
: return
0
;
0040D698
xor
eax,eax
101
: }
0040D69A
pop
edi
0040D69B
pop
esi
0040D69C
pop
ebx
0040D69D
mov
esp,ebp
0040D69F
pop
ebp
0040D6A0
ret
</ dl> however,
(1) if a member variable that requires a constructor is added, the default ctor is called, such as STD ::string
C/C++ code
-
#include
<
string
>
class
A
{
public
:
int
a;
char
*
ptr;
std::
string
test;
};
int
main()
{
A a;
return
0
;
-
}
Assembly code
-
int
main()
99
: {
0040D680
push
ebp
0040D681
mov
ebp,esp
0040D683
sub
esp,5Ch
0040D686
push
ebx
0040D687
push
esi
0040D688
push
edi
0040D689
lea
edi,[ebp-5Ch]
0040D68C
mov
ecx,17h
0040D691
mov
eax,0CCCCCCCCh
0040D696
rep
stos dword ptr [edi]
100
: A a
;
0040D698
lea
ecx,[ebp-18h]
;
this Pointer
0040D69B
call
@ILT+
35
(
A:
:A) (
00401028
)
;
The defaultctor is called.
101
: return
0
;
0040D6A0
mov
dword ptr [ebp-1Ch],
0
0040D6A7
lea
ecx,[ebp-18h]
0040D6AA
call
@ILT+
40
(
A:
:~A) (
0040102d
)
0040D6AF
mov
eax,dword ptr [ebp-1Ch]
102
: }
0040D6B2
pop
edi
0040D6B3
pop
esi
0040D6B4
pop
ebx
0040D6B5
add
esp,5Ch
0040D6B8
cmp
ebp,esp
0040D6BA
call
__chkesp (
00401170
)
0040D6BF
mov
esp,ebp
0040D6C1
pop
ebp
0040D6C2
ret
(2) has a virtual function and will call the default ctor, such as:
C/C++ code
-
[code
=
C
/
C
++
]
class A
{
public:
int a;
char *ptr;
virtual void dd(){a=1;}
};
int main()
{
A a;
return 0;
}
corresponding Assembly
Assembly code
-
100
: A a
;
00401048
lea
ecx,[ebp-0Ch]
0040104B
call
@ILT+
15
(
A:
:A) (
00401014
)
;
The main thing here is to put the first address of the virtual function table into the first four bytes.
can be summarized as follows: the compiler always produces the default ctor when it is needed and when the user does not provide it. Doing so yields optimal efficiency.