If 'Test' is an ordinary class, is there any difference between:
Test* test = new Test;
and
Test* test = new Test();
cc++-faqconstructorinitializationnew-operator
If 'Test' is an ordinary class, is there any difference between:
Test* test = new Test;
and
Test* test = new Test();
Best Answer
Let's get pedantic, because there are differences that can actually affect your code's behavior. Much of the following is taken from comments made to an "Old New Thing" article.
Sometimes the memory returned by the new operator will be initialized, and sometimes it won't depending on whether the type you're newing up is a POD (plain old data), or if it's a class that contains POD members and is using a compiler-generated default constructor.
Assume:
In a C++98 compiler, the following should occur:
new A
- indeterminate valuenew A()
- zero-initializenew B
- default construct (B::m is uninitialized)new B()
- default construct (B::m is uninitialized)new C
- default construct (C::m is zero-initialized)new C()
- default construct (C::m is zero-initialized)In a C++03 conformant compiler, things should work like so:
new A
- indeterminate valuenew A()
- value-initialize A, which is zero-initialization since it's a POD.new B
- default-initializes (leaves B::m uninitialized)new B()
- value-initializes B which zero-initializes all fields since its default ctor is compiler generated as opposed to user-defined.new C
- default-initializes C, which calls the default ctor.new C()
- value-initializes C, which calls the default ctor.So in all versions of C++ there's a difference between
new A
andnew A()
because A is a POD.And there's a difference in behavior between C++98 and C++03 for the case
new B()
.This is one of the dusty corners of C++ that can drive you crazy. When constructing an object, sometimes you want/need the parens, sometimes you absolutely cannot have them, and sometimes it doesn't matter.