Всегда ли вызывается конструктор C ++ по умолчанию, как указано в C ++ Primer?

Я новичок в C ++. Не обращайте внимания на этот глупый вопрос:

В 4-м издании учебника по C ++ (Стэнли Липманн) на странице 52 есть предложение, которое гласит:

Конструктор по умолчанию используется независимо от того, где определена переменная.

Кто-нибудь может объяснить немного больше? Кажется, что в этих утверждениях чего-то не хватает.

7
задан paxdiablo 24 August 2010 в 06:56
поделиться

4 ответа

Если у вас есть класс Object :

class Object
{
public:
    int x;

    Object() { x = 5; }
};

и вы создаете его экземпляр в функции, подобной этой:

void foo()
{
    Object obj;
    // obj.x == 5
}

Будет использоваться конструктор по умолчанию. Объекты также создаются с помощью конструктора по умолчанию, когда вы объявляете их в другом классе и создаете экземпляр этого другого класса:

class AnotherObject
{
public:
    Object obj;
};

void bar()
{
    AnotherObject another;
    // another.obj.x == 5
}
3
ответ дан 7 December 2019 в 03:09
поделиться

Предположительно вы имеете в виду Стэнли Липпмана?

В любом случае, хотя у меня нет под рукой копии, которую можно было бы проверить, я предполагаю, что он имеет в виду, если у вас есть что-то вроде:

myclass X;

... объект X будет инициализирован с помощью ctor по умолчанию, независимо от того, является ли объект глобальным (вне какой-либо функции), локальным для функции или локальным для какой-либо другой области внутри функции (например, в для цикла ).

Сравните это со встроенной строкой типа int , которая имеет гораздо более сложные правила: глобальный int (один определен вне любой функции) или один, определенный внутри функции, но с классом хранения static , будет инициализирован нулем, но int , определенный с автоматическим хранением (определен внутри функции, без указания static ), является "по умолчанию initialized ", что (в данном случае) означает, что он не инициализирован предсказуемым значением.

1
ответ дан 7 December 2019 в 03:09
поделиться

Из самой книги:

Каждый класс может также определять, что произойдет, если переменная определенного типа определена, но инициализатор не предоставлен. Класс делает это, определяя специальный конструктор, известный как конструктор по умолчанию . Этот конструктор называется конструктором по умолчанию, потому что он запускается «по умолчанию»; если инициализатора нет, то используется этот конструктор. Конструктор по умолчанию используется независимо от того, где определена переменная.

(курсив мой).

Итак, вы попали в раздел книги, где уже говорится о конструкторах по умолчанию (как должно быть очевидно в некоторых других ответах, конструктор по умолчанию определенно не всегда используется) .

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

5
ответ дан 7 December 2019 в 03:09
поделиться

$12.1

Конструктор по умолчанию (12.1), конструктор копирования и оператор присваивания (12.8) и деструктор (12.4) являются специальными функциями-членами. Реализация будет неявно объявлять эти функции-члены для типа класса, если программа не объявляет их явно, за исключением случаев, отмеченных в 12.1. Реализация будет неявно определять их, если они используются, как указано в 12.1, 12.4 и 12.8. Программы не должны определять неявно объявленные специальные функции-члены. Программы могут явно ссылаться на неявно объявленные специальные функции-члены. [Пример: программа может явно вызвать, взять адрес или сформировать указатель на член неявно объявленной специальной функции-члена.

0
ответ дан 7 December 2019 в 03:09
поделиться
Другие вопросы по тегам:

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