Variabilní inicializaci a konstruktéři

hlasů
2

Já jsem v současné době C ++ kurzu a snaží se získat hluboké pochopení celé věci. Přišel jsem s některými teoriemi, že by bylo skvělé, kdyby někdo by je mohl potvrdit:

Každá proměnná (local, globální, staic, člen a nečlen), je zaručeno, že jeho ctor volal před prvním použitím

K ctors primitiv jako int jsou v podstatě ne-ops, takže jsme přiřadili hodnotu, neexistuje žádná výchozí nulová hodnota.

Následující třídy jsou sémanticky stejné (a měl by generovat identický kód)

class A 
{ 
  int n; 
};

a

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

a

class A 
{
  int n;
 public:
  A() { n = int(); }
};

Proměnná n je v každém případě stále neinicializované.

UPRAVIT:

Zdá se, že jsem absolutetly podcenila složitost této věci, většina mých předpokladů se mýlili. Nyní IAM stále snaží zjistit základní pravidla objektu inicializace.

Položena 11/06/2009 v 09:44
zdroj uživatelem
V jiných jazycích...                            


4 odpovědí

hlasů
4

Obávám se, že se mýlíte. Když říkáte:

int n = int();

Pak n (a všechny ostatní typy POD) vynuluje inicializaci.

Také se ujistěte, že jste ve své mysli o rozdílu mezi počáteční nastavení a přiřazení zcela jasné - to je docela důležité v C ++:

int n = int();    // initialisation
n = 0;            // assignment
Odpovězeno 11/06/2009 v 09:47
zdroj uživatelem

hlasů
3

Dalo by se najít to zajímavé.

Rozdíl mezi novým a novým Foo foo (), je skutečnost, že bývalý bude neinicializovanou a ten bude default inicializuje (k nule), když Foo je typ POD. Takže, když ne pomocí formuláře s parens, člen „a“ může obsahovat odpadky, ale s parens „a“ bude vždy inicializuje na 0 ° C.

Odpovězeno 11/06/2009 v 09:49
zdroj uživatelem

hlasů
1
class A 
{ 
   int n; 
};

Pouze paměti je přiděleno, ani inicializace udělal pro n.


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

Zde nse inicializuje s 0.


class A 
{
  int n;
 public:
  A() { n = int(); }
};

Zde nje nejprve postavena (bez výchozí hodnoty), potom int()způsobuje dočasnou int má být vytvořen s hodnotou 0, která je pak přiřazen n;

Odpovězeno 11/06/2009 v 10:52
zdroj uživatelem

hlasů
1

Ne, je proměnná vlevo pouze zovaných v prvním případě.

Pro člena, který je třídou s uživatelem definovaný konstruktor, situace je jednoduché: konstruktor je vždy volána.

Předdefinovaných typů (a ‚obyčejné údajů‘ structs) může být ponechán zovaných, jako v prvním příkladu. Ačkoli nemají uživatelem zadané konstruktérů, pomocí syntaxe konstrukce (vaše další dva příklady) inicializuje je na nule.

Důvodem pro toto poněkud složité pravidlem je, aby se zabránilo zbytečnému režii; Například, pokud je definován:

struct S
{
   int array[1024*1024];
};

s úmyslem pouze přiřazení hodnot, jak je potřeba, byste nechtěli kompilátor očistit 4MB paměti nulami, kdykoliv postavit jeden.

Odpovězeno 11/06/2009 v 10:11
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more