前言
很多时候,我们在看代码的时候会看到在new一个对象时会有以下两种形式
MyClass *a = new MyClass;
MyClass *b = new MyClass();
然而这两种方式有什么区别呢,我们探究一下
代码演示
1.演示代码原型
#include <iostream>
using namespace std;
/*这是一个类*/
class MyClass
{
public:
MyClass() {};
~MyClass() {};
};
/*主函数*/
int main(int argc, char **argv)
{
return 0;
}
2.接下来添加一些验证的数据和函数
#include <iostream>
using namespace std;
/*这是一个类*/
class MyClass
{
public:
MyClass() {};
~MyClass() {};
public:
int getValue()
{
return _value;
}
private:
int _value;
};
/*主函数*/
int main(int argc, char **argv)
{
return 0;
}
验证1
#include <iostream>
using namespace std;
class MyClass
{
public:
MyClass() {};
~MyClass() {};
public:
int getValue()
{
return _value;
}
private:
int _value;
};
int main(int argc, char **argv)
{
MyClass *a = new MyClass; /*无括号*/
MyClass *b = new MyClass(); /*有括号*/
cout << "a = " << a->getValue() << endl;
cout << "b = " << b->getValue() << endl;
return 0;
}
以上可以看到,不管有没有括号,都是输出随机值,当然我们的构造函数里并没有对_value 进行初始化或赋值、
验证2
#include <iostream>
using namespace std;
class MyClass
{
public:
int getValue()
{
return _value;
}
private:
int _value;
};
int main(int argc, char **argv)
{
MyClass *a = new MyClass;
MyClass *b = new MyClass();
cout << "a = " << a->getValue() << endl;
cout << "b = " << b->getValue() << endl;
return 0;
}
以上可以看到,对象b的数据成员被初始化为0,而对象a还是随机值,这时候带()和不带()的区别就出来了
总结
1.在验证1中,我们提供了构造函数和析构函数,此时不管带不带括号,在new一个对象时只进行内存分配,初始化和赋值工作依赖于我们提供的构造函数。
2.在验证2中,我们不提供构造函数和析构函数:
MyClass *a = new MyClass; 在进行内存分配的同时不会对内存进行默认初始化(随机值).
MyClass *b = new MyClass(); 在进行内存分配的同时并对内存进行默认初始化(0).
结论:尽量使用 MyClass *b = new MyClass();的形式,并为该类编写构造函数并进行一系列的初始化或赋值操作,不要依赖系统默认未定义行为。