C++类一定有构造函数吗
1:任何类如果没有定义默认构造函数,就会合成出来?
2:合成出来的默认构造函数会明确设定类内每一个成员的值?
3:如何去证明呢?
如果你对1、2回答的都是不是,请跳过阅读,以免浪费你的时间
对于问题1与2其实答案都是未必,C++标准是这样写的默认构造函数是由编译器在需要的时候将其合成出来,这里强调的是需要,而非必需,以程序示例:
[cpp]
#include<iostream>
#include<string>
using namespace std;
class A
{
public:
char *ptr;
//string str;
};
int main()
{
A b;
b.ptr=NULL;
return 0;
}
#include<iostream>
#include<string>
using namespace std;
class A
{
public:
char *ptr;
//string str;
};
int main()
{
A b;
b.ptr=NULL;
return 0;
}这个程序本身没什么好讲的,能讲的就是其汇编代码,调试状态下进入汇编代码如下:
[cpp]
11: {
00401030 push ebp
00401031 mov ebp,esp
00401033 sub esp,44h
00401036 push ebx
00401037 push esi
00401038 push edi
00401039 lea edi,[ebp-44h]
0040103C mov ecx,11h
00401041 mov eax,0CCCCCCCCh
00401046 rep stos dword ptr [edi]
12: A b;
13: b.ptr=NULL;
00401048 mov dword ptr [ebp-4],0
14: return 0;
0040104F xor eax,eax
15: }
11: {
00401030 push ebp
00401031 mov ebp,esp
00401033 sub esp,44h
00401036 push ebx
00401037 push esi
00401038 push edi
00401039 lea edi,[ebp-44h]
0040103C mov ecx,11h
00401041 mov eax,0CCCCCCCCh
00401046 rep stos dword ptr [edi]
12: A b;
13: b.ptr=NULL;
00401048 mov dword ptr [ebp-4],0
14: return 0;
0040104F xor eax,eax
15: }
你能找到构造函数调用的地方吗即A::A(),:),找不到吧,因为压根就没有构造函数,这个类就相当于一个整形变量(存储上相似,用法上不同),其空间是堆栈ebp+4这里的4个字节
将程序注释中的
[cpp]
//string str;
//string str;
去掉,再次进入汇编看看,代码如下:
[html]
10: int main()
11: {
00401070 push ebp
00401071 mov ebp,esp
00401073 sub esp,58h
00401076 push ebx
00401077 push esi
00401078 push edi
00401079 lea edi,[ebp-58h]
0040107C mov ecx,16h
00401081 mov eax,0CCCCCCCCh
00401086 rep stos dword ptr [edi]
12: A b;
00401088 lea ecx,[ebp-14h]
0040108B call @ILT+15(A::A) (00401014)
13: b.ptr=NULL;
00401090 mov dword ptr [ebp-14h],0
14: return 0;
00401097 mov dword ptr [ebp-18h],0
0040109E lea ecx,[ebp-14h]
004010A1 call @ILT+30(A::~A) (00401023)
004010A6 mov eax,dword ptr [ebp-18h]
15: }
10: int main()
11: {
00401070 push ebp
00401071 mov ebp,esp
00401073 sub esp,58h
00401076 push ebx
00401077 push esi
00401078 push edi
00401079 lea edi,[ebp-58h]
0040107C mov ecx,16h
00401081 mov eax,0CCCCCCCCh
00401086 rep stos dword ptr [edi]
12: A b;
00401088 lea ecx,[ebp-14h]
0040108B call @ILT+15(A::A) (00401014)
13: b.ptr=NULL;
00401090 mov dword ptr [ebp-14h],0
14: return 0;
00401097 mov dword ptr [ebp-18h],0
0040109E lea ecx,[ebp-14h]
004010A1 call @ILT+30(A::~A) (00401023)
004010A6 mov eax,dword ptr [ebp-18h]
15: }
看看,我们的构造函数出现了吧A:A() :),为什么会出现呢?
因为类里面有一个类叫string,我们跟踪发现string类定义在include/xstring里,其形式如下:
[cpp]
typedef basic_string<char, char_traits<char>, allocator<char> >
&
补充:软件开发 , C++ ,