C++ 中new对象时加括号()与不加括号()分析


前言

很多时候,我们在看代码的时候会看到在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();的形式,并为该类编写构造函数并进行一系列的初始化或赋值操作,不要依赖系统默认未定义行为。


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM