non, tu dois attraper les exceptions éventuelles uniquement si ça a un sens de faire ça.
dans ton exemple, si l'existence de A n'a pas de sens sans celle de C, alors pas la peine d'attraper l'exception lancée par C dans A. par contre tu peux mettre un try/catch autour de la création de A si ça a plus de sens. En gros tu attrapes l'exception quand tu as quelque chose à faire en cas d'erreur, sinon tu l'attrapes plus haut.
il y a d'autres cas où tu dois attraper les exceptions dans les constructeurs : si tu as alloué de la mémoire avec un new avant qu'il n'y ait l'exception, tu dois la libérer
//si C échoue, A doit échouer
class A
{
public:
A()
{
b = new D();
try
{
c = new C();
}
catch(...)
{
delete b;
throw; // relance l'exception attrapée par le catch
}
}
B *b;
C *c;
};
note que dans ce cas, il vaut mieux utiliser un std::auto_ptr ou équivalent pour contenir B* et C*. un auto_ptr va détruire automatiquement l'objet pointé quand le pointeur dest détruit, contrairement à un pointeur normal. et là, plus besoin de try/catch dans A
autre cas où tu peux vouloir attraper une exception : si tu veux traduire une exeption en une autre :
*mObj;
};
[nosmile]
class MonAppli::A
{
public:
A()
{
try
{
mObj = new une_lib_externe::objet();
}
catch(const une_lib_externe::exception &e)
{
throw MonAppli::Exception(e.des_details());
}
}
une_lib_externe::objet
([source] ne fonctionne pas avec le c++ ?)comme ça si le reste de ton appli ne doit pas avoir connaissance de une_lib_externe, tu peux quand même faire remonter les exeptions et les traiter comme les autres
./1071> le vecteur détruit les objets qu'il contient (s'il contient un pointeur, il détruite le pointeur mais pas l'objet pointé)
mais il faut bien comprendre que le vecteur va contenir des copies des objets que tu as passé en paramètre à push_back. il y a toutes les chances que machin1, et machin2 aient été crées sur la pile. le vecteur ne peut pas s'approprier la portion de la pile dans laquelle sont machin1 et machin2

donc il les copie