帮我看看这个问题

ratzip 2011-05-05 04:14:39
大家好,我在面试的时候被问到这样一个问题,

Test *t1 = new Test();
Test *t2 = new Test;

这个Test类里有一个用户自己定义的默认构造函数,那么上面两行代码都做了什么,有什么区别?

我知道这个new Test;是会去调用默认的构造函数, new Test()是调用没有参数的构造函数, 这个问题的题干没有Test类的定义,所以我也不知道用户自己定义的默认构造函数是什么样子,不知道有没有参数,那么怎么解答这个问题,默认的构造函数是什么样子的,怎么定义?
...全文
61 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
luciferisnotsatan 2011-05-05
  • 打赏
  • 举报
回复
如果Test 类成员变量都是内建类型,同时没有自己写无参的构造函数,那么new Test不会初始化对象
class Test
{
public:
// Test(){};
int x;
};


Test *t1 = new Test();
00412A5E mov dword ptr [ebp-0F8h],4
00412A68 mov eax,dword ptr [ebp-0F8h]
00412A6E push eax
00412A6F call operator new (411622h)
00412A74 add esp,4
00412A77 mov dword ptr [ebp-0ECh],eax
00412A7D cmp dword ptr [ebp-0ECh],0
00412A84 je main+6Ch (412AACh)
00412A86 mov ecx,dword ptr [ebp-0F8h]
00412A8C push ecx
00412A8D push 0
00412A8F mov edx,dword ptr [ebp-0ECh]
00412A95 push edx
00412A96 call @ILT+510(_memset) (411203h)
00412A9B add esp,0Ch
00412A9E mov eax,dword ptr [ebp-0ECh]
00412AA4 mov dword ptr [ebp-100h],eax
00412AAA jmp main+76h (412AB6h)
00412AAC mov dword ptr [ebp-100h],0
00412AB6 mov ecx,dword ptr [ebp-100h]
00412ABC mov dword ptr [t1],ecx
Test *t2 = new Test;
00412ABF push 4
00412AC1 call operator new (411622h)
00412AC6 add esp,4
00412AC9 mov dword ptr [ebp-0E0h],eax
00412ACF mov eax,dword ptr [ebp-0E0h]
00412AD5 mov dword ptr [t2],eax


但如果显示写了,就没有区别。
class Test
{
public:
Test(){};
int x;
};

Test *t1 = new Test();
0041571D push 4
0041571F call operator new (411622h)
00415724 add esp,4
00415727 mov dword ptr [ebp-104h],eax
0041572D mov dword ptr [ebp-4],0
00415734 cmp dword ptr [ebp-104h],0
0041573B je main+70h (415750h)
0041573D mov ecx,dword ptr [ebp-104h]
00415743 call Test::Test (41174Eh)
00415748 mov dword ptr [ebp-118h],eax
0041574E jmp main+7Ah (41575Ah)
00415750 mov dword ptr [ebp-118h],0
0041575A mov eax,dword ptr [ebp-118h]
00415760 mov dword ptr [ebp-110h],eax
00415766 mov dword ptr [ebp-4],0FFFFFFFFh
0041576D mov ecx,dword ptr [ebp-110h]
00415773 mov dword ptr [ebp-14h],ecx
Test *t2 = new Test;
00415776 push 4
00415778 call operator new (411622h)
0041577D add esp,4
00415780 mov dword ptr [ebp-0ECh],eax
00415786 mov dword ptr [ebp-4],1
0041578D cmp dword ptr [ebp-0ECh],0
00415794 je main+0C9h (4157A9h)
00415796 mov ecx,dword ptr [ebp-0ECh]
0041579C call Test::Test (41174Eh)
004157A1 mov dword ptr [ebp-118h],eax
004157A7 jmp main+0D3h (4157B3h)
004157A9 mov dword ptr [ebp-118h],0
004157B3 mov eax,dword ptr [ebp-118h]
004157B9 mov dword ptr [ebp-0F8h],eax
004157BF mov dword ptr [ebp-4],0FFFFFFFFh
004157C6 mov ecx,dword ptr [ebp-0F8h]
004157CC mov dword ptr [ebp-20h],ecx


如果成员有非内建类型,也没有区别
class Test
{
public:
//Test(){};
int x;
string str;
};


Test *t1 = new Test();
00412A8D push 24h
00412A8F call operator new (411627h)
00412A94 add esp,4
00412A97 mov dword ptr [ebp-104h],eax
00412A9D mov dword ptr [ebp-4],0
00412AA4 cmp dword ptr [ebp-104h],0
00412AAB je main+70h (412AC0h)
00412AAD mov ecx,dword ptr [ebp-104h]
00412AB3 call Test::Test (4115D7h)
00412AB8 mov dword ptr [ebp-118h],eax
00412ABE jmp main+7Ah (412ACAh)
00412AC0 mov dword ptr [ebp-118h],0
00412ACA mov eax,dword ptr [ebp-118h]
00412AD0 mov dword ptr [ebp-110h],eax
00412AD6 mov dword ptr [ebp-4],0FFFFFFFFh
00412ADD mov ecx,dword ptr [ebp-110h]
00412AE3 mov dword ptr [ebp-14h],ecx
Test *t2 = new Test;
00412AE6 push 24h
00412AE8 call operator new (411627h)
00412AED add esp,4
00412AF0 mov dword ptr [ebp-0ECh],eax
00412AF6 mov dword ptr [ebp-4],1
00412AFD cmp dword ptr [ebp-0ECh],0
00412B04 je main+0C9h (412B19h)
00412B06 mov ecx,dword ptr [ebp-0ECh]
00412B0C call Test::Test (4115D7h)
00412B11 mov dword ptr [ebp-118h],eax
00412B17 jmp main+0D3h (412B23h)
00412B19 mov dword ptr [ebp-118h],0
00412B23 mov eax,dword ptr [ebp-118h]
00412B29 mov dword ptr [ebp-0F8h],eax
00412B2F mov dword ptr [ebp-4],0FFFFFFFFh
00412B36 mov ecx,dword ptr [ebp-0F8h]
00412B3C mov dword ptr [ebp-20h],ecx


xyq129052 2011-05-05
  • 打赏
  • 举报
回复
应该有区别 一个初始化一个没有吧
qiaolixian 2011-05-05
  • 打赏
  • 举报
回复
有区别
加()是为了调用构造参数(无参数的)
不加()有些类为了调用所有具有参数的构造参数
SoulRed 2011-05-05
  • 打赏
  • 举报
回复
还是有区别的。
有的时候。不加()是无法实例化该类的。有些类没有默认的构造参数
老邓 2011-05-05
  • 打赏
  • 举报
回复
默认构造函数当然是没有参数的构造函数了。
class Test
{
Test() {} // 这就是默认的构造函数

所以两个用法没区别。
要说区别,那也只是多打了一个()而已。

64,682

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧