当前位置:编程学习 > C/C++ >>

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++ ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,