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