0

Est-ce que SomeClass * initialEl = new SomeClass [5]; nécessairement compiler, en supposant que SomeClass n'a pas de constructeur par défaut non déclaré publiquement? Considérez:SomeClass * initialEl = new SomeClass [5];

/* 
* 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; 
} 
+1

Vous devez utiliser 'delete []' lors de la suppression de tableaux. – Job

+0

Non, vous devriez utiliser 'std :: vector' de sorte que vous supprimerez toujours automatiquement. Il n'y a aucune raison de ne pas utiliser un vecteur. – GManNickG

+0

Zéro raison? Qu'en est-il de la performance en général? Que faire si je veux utiliser le placement nouveau plus tard (ce que je fais)? – user383352

Répondre

1

Non, il ne compilera pas sans constructeur par défaut . Dans ce cas, il n'y a pas de constructeur par défaut généré par le compilateur, car vous avez défini un autre constructeur. "Le compilateur essaiera d'en générer un si nécessaire et si l'utilisateur n'a pas déclaré d'autres constructeurs." - Le langage de programmation C++, Stroustrup

Si vous voulez vraiment utiliser new SomeClass[5], vous devrez également fournir un constructeur par défaut.

+0

Mais mon compilateur note un candidat comme SomeClass :: SomeClass (const SomeClass &). – user383352

+4

Ce n'est pas un constructeur par défaut. C'est un constructeur de copie. –

+0

Oh OK! Mais explicitement déclaré? – user383352

5

En supposant que SomeClass ait un constructeur par défaut accessible au public, oui.

Notez qu'il ya une différence entre

  1. ayant un constructeur par défaut accessible au public (ce que je l'ai dit) et
  2. ne pas avoir un constructeur par défaut non déclaré publiquement (ce que vous avez dit)

Pour la classe suivante 2. est vrai, mais 1. n'est pas:

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

Cela est dû à §12.1/5 (C++ 03):

If there is no user-declared constructor for class X, a default constructor is implicitly declared. An implicitly-declared default constructor is an inline public member of its class.


Avec votre mise à jour, SomeClass n'a pas de constructeur par défaut. Vous n'en avez pas déclaré un et comme vous avez déclaré un autre constructeur, le compilateur ne le déclarera pas non plus implicitement.

Si vous en avez besoin, vous devez implémenter vous-même:

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

Ou laisser un autre constructeur se qualifier en tant que constructeur par défaut:

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

Je ne suis pas si sûr. – user383352

+0

@dre: Pourquoi ....? –

+0

J'ai du mal à compiler le code que j'ai posté ci-dessus. – user383352