这里有一篇Blog有讲解这个问题->C++中创建对象的时候加括号和不加括号的区别
看过一遍之后大概懂了,结论就是:
对于自定义class来说,new className; 和 new className(); 的作用完全相同,均是调用自定义class的无参构造函数。如果这个自定义class仅有带参数的构造函数,则上面两种用法均会报错。
对于内置类型来说,new typeName; 和 new typeName(); 的作用不完全相同。虽然它们均调用了内置类型的默认构造函数,但是 new typeName(); 的用法会对对象进行初始化。
为了防止忘记,自己来写一段代码试试效果:
//MyData.h
#include "stdio.h"
#include <iostream>
class MyData
{
public:
MyData();
MyData(int nNo);
void showMe();
private:
int m_nNo;
};
//MyData.cpp
int main()
{
std::cout << "---自定义Class----" << std::endl;
MyData data1; //使用默认构造函数,构造一个MyData对象
std::cout << "-----------------" << std::endl;
MyData data2(); //声明一个返回值为MyData的函数,这里不会有输出
std::cout << "-----------------" << std::endl;
MyData data3(1); //使用带参构造函数,构造一个MyData对象
std::cout << "-----------------" << std::endl;
MyData *pData1 = new MyData; //使用默认构造函数
std::cout << "-----------------" << std::endl;
MyData *pData2 = new MyData(); //使用默认构造函数
std::cout << "-----------------" << std::endl;
MyData *pData3 = new MyData(88);//使用带參构造函数
std::cout << "-----------------" << std::endl;
pData1->showMe();
std::cout << "-----------------" << std::endl;
pData2->showMe();
std::cout << "-----------------" << std::endl;
pData3->showMe();
std::cout << "-----------------" << std::endl;
std::cout << "-----内置Class----" << std::endl;
int nNo1; //定义一个int类型变量
int nNo2(); //声明一个返回值为int的函数
int nNo3(1); //定义一个int类型变量,初始化为1
std::cout << "Int->" << nNo1 << std::endl;
std::cout << "Int->" << nNo2 << std::endl;
std::cout << "Int->" << nNo3 << std::endl;
int *pNo1 = new int; //使用默认构造函数
int *pNo2 = new int(); //使用默认构造函数(不确定这里会不会进行初始化,是否与new int;的用法有什么不同)
int *pNo3 = new int(88); //使用带参构造函数
std::cout << "Int->" << pNo1 << std::endl; //输出地址
std::cout << "Int->" << pNo2 << std::endl; //输出地址
std::cout << "Int->" << pNo3 << std::endl; //输出地址
std::cout << "Int->" << *pNo1 << std::endl; //输出值
std::cout << "Int->" << *pNo2 << std::endl; //输出值
std::cout << "Int->" << *pNo3 << std::endl; //输出值
return 0;
}
上面的代码我自己运行过,可能是因为运行的环境有所不同,得出的结果并没有明确的反映文章开头部分所说,这两种用法对于内置对象的区别。(也有可能是c++11版关于上述方法的功能修改过了)。上面代码输出如下:
---自定义Class----
MyData()
-----------------
-----------------
MyData(int)
-----------------
MyData()
-----------------
MyData()
-----------------
MyData(int)
-----------------
I am No. 0
-----------------
I am No. 0
-----------------
I am No. 88
-----------------
-----内置Class----
Int->1
Int->1
Int->1
Int->0x6080000043f0
Int->0x608000004400
Int->0x6080000043e0
Int->0
Int->0
Int->88