В C++ существует ли неявный конструктор по умолчанию?

для меня это сделало трюк!

navigationView = (NavigationView) findViewById (R.id.nav_view);

navigationView.bringToFront ();

62
задан Skilldrick 18 February 2009 в 22:56
поделиться

8 ответов

Если Вы не определите конструктора, то компилятор определит конструктора по умолчанию для Вас.

реализация этого

конструктор по умолчанию:

  • значение по умолчанию создает базовый класс (если базовый класс не имеет конструктора по умолчанию, это - отказ компиляции)
  • , значение по умолчанию создает каждую членскую переменную в порядке объявления. (Если у участника нет конструктора по умолчанию, это - отказ компиляции).

Примечание:
данные POD (интервал, плавание, указатель, и т.д.) не имеют явного конструктора, но действие по умолчанию ничего не должно делать (в лопасти философии C++; мы не хотим платить за что-то, если мы явно не просим его).

, Если никакой Конструктор/Оператор присваивания деструктора/копии не определяется сборки компилятора один из тех, которые для Вас (таким образом, класс всегда имеет Конструктора/Оператор присваивания деструктора/Копии (если Вы не обманываете и явно объявляете один, но не определяете его)).
реализация по умолчанию:

Деструктор:

  • , Если пользовательский деструктор определяется, выполните предоставленный код.
  • Вызов деструктор каждого члена в обратном порядке объявления
  • Вызов деструктор базового класса.

Конструктор Копии:

  • Вызов Конструктор Копии Базового класса.
  • Вызов конструктор копии для каждой членской переменной в порядке объявления.

Оператор присваивания:

  • Вызов оператор присваивания базового класса
  • Вызов оператор присваивания каждой членской переменной в порядке объявления.
  • Возврат ссылка на это.

Конструкция/Оператор присваивания Копии Примечания Данных POD просто копирует данные (Следовательно мелкая проблема копии, связанная с НЕОБРАБОТАННЫМИ указателями).

63
ответ дан Mansuro 7 November 2019 в 12:55
поделиться

Я думаю, что стоит указать, что конструктор по умолчанию будет только создан компилятором, если Вы обеспечите никакой конструктор безотносительно . Это означает, предоставляете ли Вы только одному конструктору, который берет аргумент, компилятор будет не , создают конструктора без аргументов по умолчанию для Вас.

поведение обнуления, что Ваши переговоры по книге о, вероятно, характерны для конкретного компилятора. Я всегда предполагал, что это может варьироваться и что необходимо явно инициализировать любые элементы данных.

38
ответ дан Bill the Lizard 7 November 2019 в 12:55
поделиться

C++ действительно генерирует конструктора по умолчанию, но только если Вы не обеспечиваете одно собственное. В стандарте ничто не говорится об обнулении элементов данных. По умолчанию, когда Вы сначала создаете любой объект, они не определены.

Это могло бы сбивать с толку, потому что большинство типов примитивов C++ ДЕЙСТВИТЕЛЬНО имеет "конструкторов" по умолчанию, которых init их для обнуления (интервал (), bool (), дважды (), долго (), и т.д. ), но компилятор не называет их к init участникам POD как он, делает для элементов объекта.

стоит отметить, что STL делает использование эти конструкторы к конструкции по умолчанию содержание контейнеров, которые содержат типы примитивов. Можно смотреть на этот вопрос для получения дополнительной информации о том, как вещи в контейнерах STL получают inited.

20
ответ дан Community 7 November 2019 в 12:55
поделиться

Конструктор по умолчанию, созданный для класса, не инициализирует встроенные типы, но он назовет конструктора по умолчанию на всех пользовательских участниках:

class Foo
{
public:
     int x;
     Foo() : x(1) {}
};

class Bar
{
public:
     int y;
     Foo f;
     Foo *fp;
};

int main()
{

    Bar b1; 
    ASSERT(b1.f.x == 1); 
    // We know nothing about what b1.y is set to, or what b1.fp is set to.

    // The class members' initialization parallels normal stack initialization.
    int y;  
    Foo f; 
    Foo *fp; 
    ASSERT(f.x == 1);
    // We know nothing about what y is set to, or what fp is set to.

}
11
ответ дан Eclipse 7 November 2019 в 12:55
поделиться

Компилятор генерирует конструкторов по умолчанию и деструкторы, если созданные пользователями не будут присутствовать. Они НЕ изменят состояние никаких элементов данных.

В C++ (и C) содержание любых выделенных данных не гарантируется. В настройках отладочного процесса некоторые платформы установят это на известное значение (например, 0xFEFEFEFE), чтобы помочь определить ошибки, но на это нельзя положиться.

5
ответ дан Andrew Grant 7 November 2019 в 12:55
поделиться

Обнуление только происходит для globals. Таким образом, если Ваш объект будет объявлен в глобальной области видимости, то ее участники будут обнулены:

class Blah
{
public:
    int x;
    int y;
};

Blah global;

int main(int argc, char **argv) {
    Blah local;
    cout<<global.x<<endl;  // will be 0
    cout<<local.x<<endl;   // will be random
}
4
ответ дан codelogic 7 November 2019 в 12:55
поделиться

C++ генерирует конструктора по умолчанию. В случае необходимости (определенный во время компиляции я верю), это также генерирует конструктора копии по умолчанию и конструктора присвоения по умолчанию. Я ничего не услышал о гарантиях обнуления памяти все же.

1
ответ дан Jason Punyon 7 November 2019 в 12:55
поделиться

C++ делает не гарантия, обнуляющая память. Java и C# делают (так сказать).

Некоторые компиляторы могли бы, но не зависеть от этого.

4
ответ дан Jason Cohen 7 November 2019 в 12:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: