SomeClass * initialEl = new SomeClass [5];

时间:2010-07-15 17:37:16

标签: c++ class memory-management dynamic-memory-allocation dynamic-arrays

SomeClass * initialEl = new SomeClass [5];必须编译,假设SomeClass没有非公开声明的默认构造函数?考虑:

/*
 * SomeClass.h
 *
 */

#ifndef SOMECLASS_H_
#define SOMECLASS_H_

class SomeClass
{

public:
    SomeClass(int){}
    ~SomeClass(){}
};

#endif /* SOMECLASS_H_ */


/*
 * main.cpp
 *
 */

#include "SomeClass.h"

int main()
{
    SomeClass* initialEl = new SomeClass[5];

    delete[] initialEl;

    return 0;
}

2 个答案:

答案 0 :(得分:5)

假设SomeClass有一个可公开访问的默认构造函数,是的。

请注意

之间存在差异
  1. 有一个可公开访问的默认构造函数(我说的)和
  2. 没有非公开声明的默认构造函数(你说的是什么)
  3. 对于以下类 2。为true但 1。不是:

    class A {
        SomeClass(const SomeClass&) {}
    };
    

    这是由于§12.1/ 5 (C ++ 03):

      

    如果类X没有用户声明的构造函数,则隐式声明默认构造函数。   隐式声明的默认构造函数是其类的inline public成员。


    通过更新,SomeClass没有默认构造函数。你没有声明一个,因为你已经声明了另一个构造函数,编译器也不会隐式声明它。

    如果您需要,您必须自己实施:

    class A {
    public:
        SomeClass(int) {}
        SomeClass() {}
    };
    

    或者让另一个构造函数符合默认构造函数:

    class A {
    public:
        SomeClass(int=0) {}
    };
    

答案 1 :(得分:1)

不,没有默认构造函数就不能编译。在这种情况下,没有编译器生成的默认构造函数,因为您已经定义了另一个构造函数。 “如果需要,编译器将尝试生成一个,如果用户没有声明其他构造函数。” - C ++编程语言,Stroustrup

如果你真的想使用new SomeClass[5],你也必须提供一个默认的构造函数。