美文网首页C++
C++语法new className; 与 new classN

C++语法new className; 与 new classN

作者: qufl | 来源:发表于2016-08-31 23:15 被阅读1156次

这里有一篇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

相关文章

网友评论

    本文标题:C++语法new className; 与 new classN

    本文链接:https://www.haomeiwen.com/subject/scdcettx.html