C ++ prázdné paren inicializace člen - vynuluje z paměti?

hlasů
3

Původně jsem napsal nějaký kód takto:

class Foo
{
public:
  Foo() : m_buffer()
    {}

private:
  char   m_buffer[1024];
};

Někdo, kdo je chytřejší než já řekl, že má m_buffer () inicializátor by nulu z paměti. Mým záměrem bylo opustit paměť neinicializované. Neměl jsem čas to dále diskutovat, ale vzbudil mou zvědavost.

Dříve jsem si myslel, že to bylo moudré, aby se vždy uvést každý člen v seznamu Inicializátor.

Mohl by někdo prosím, popsat toto chování dále?

1) Proč prázdnou paren Inicializátor vyplnit paměti?

2) Znamená to držet pouze POD datové typy? Slyšel jsem, že to bylo tak, ale nemají standardní ruce.

dík

Položena 09/04/2009 v 17:28
zdroj uživatelem
V jiných jazycích...                            


2 odpovědí

hlasů
11

Máte-li člen inicializován jako to, že to bude value-initialized. To platí i pro lusky. Pro struct, každý člen je hodnota inicializován tímto způsobem, a pro matici, každý prvek z nich je hodnota inicializována.

Hodnota inicializace pro skalární typ jako ukazatel nebo celé číslo, budete mít to inialized se 0převede na správný typ. Takže budete mít null ukazatelů či nepravdivé nebo jakýkoliv druh máte konkrétně.

Všimněte si, že toto pravidlo změnilo nepatrně z C ++ 98 až C ++ 03 (to, co máme právě teď), což může mít překvapivé důsledky. C ++ 98 neměl, že value-initialization. Uvedla výchozí inicializace se stane, což pro typ non-POD vždy znamenalo, že je výchozí konstruktor dovolává. Ale value-initializationv C ++ 03 má zvláštní význam, pokud není uživatelsky deklarován konstruktor: Každý prvek je hodnota inicializaci poté.

Zde je rozdíl:

struct A { int c; ~A() { } }; // non-POD, but no user declared ctor
struct B { A a; B():a(){ } } b;

Nyní, v C ++ 03, budete mít zaručeno, že b.a.cje nula. Zatímco v jazyce C ++ 98, b.a.cbude mít nějaký indeterminated hodnotu.

Odpovězeno 09/04/2009 v 17:43
zdroj uživatelem

hlasů
1

Dříve jsem si myslel, že to bylo moudré, aby se vždy uvést každý člen v seznamu Inicializátor.

To je zajistit, aby všichni členové jsou inicializovány.

Vyřešit váš úkol jednoduše odstranit m_buffer ze seznamu Inicializátor.

template <typename T>
struct C
{
    C():
        buff(),
        var(),
        object()
    {
    }
    T buff[128];
    T var;
    std::string object;
};

Bez ohledu na typ T používá T (), je jít na výchozí konstruktor. Pro int, znaků, atd je 0, pro pole je {T ()}. A na výuku je to prostě jejich výchozí konstruktor.

Odpovězeno 09/04/2009 v 17:34
zdroj uživatelem

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