前言
很多時候,我們在看代碼的時候會看到在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();的形式,並為該類編寫構造函數並進行一系列的初始化或賦值操作,不要依賴系統默認未定義行為。