Я новичок в C ++. Не обращайте внимания на этот глупый вопрос:
В 4-м издании учебника по C ++ (Стэнли Липманн) на странице 52 есть предложение, которое гласит:
Конструктор по умолчанию используется независимо от того, где определена переменная.
Кто-нибудь может объяснить немного больше? Кажется, что в этих утверждениях чего-то не хватает.
Если у вас есть класс 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
}
Предположительно вы имеете в виду Стэнли Липпмана?
В любом случае, хотя у меня нет под рукой копии, которую можно было бы проверить, я предполагаю, что он имеет в виду, если у вас есть что-то вроде:
myclass X;
... объект X
будет инициализирован с помощью ctor по умолчанию, независимо от того, является ли объект глобальным (вне какой-либо функции), локальным для функции или локальным для какой-либо другой области внутри функции (например, в для цикла
).
Сравните это со встроенной строкой типа int
, которая имеет гораздо более сложные правила: глобальный int
(один определен вне любой функции) или один, определенный внутри функции, но с классом хранения static
, будет инициализирован нулем, но int
, определенный с автоматическим хранением (определен внутри функции, без указания static
), является "по умолчанию initialized ", что (в данном случае) означает, что он не инициализирован предсказуемым значением.
Из самой книги:
Каждый класс может также определять, что произойдет, если переменная определенного типа определена, но инициализатор не предоставлен. Класс делает это, определяя специальный конструктор, известный как конструктор по умолчанию . Этот конструктор называется конструктором по умолчанию, потому что он запускается «по умолчанию»; если инициализатора нет, то используется этот конструктор. Конструктор по умолчанию используется независимо от того, где определена переменная.
(курсив мой).
Итак, вы попали в раздел книги, где уже говорится о конструкторах по умолчанию (как должно быть очевидно в некоторых других ответах, конструктор по умолчанию определенно не всегда используется) .
Все, что говорится в книге, это то, что в тех ситуациях, когда используется конструктор по умолчанию , не имеет никакого значения, где определена переменная (внутри или вне функций, внутри или вне классов, внутри фигурные скобки, такие как петли, операторы выбора или даже фигурные скобки и т. д.).
$12.1
Конструктор по умолчанию (12.1), конструктор копирования и оператор присваивания (12.8) и деструктор (12.4) являются специальными функциями-членами. Реализация будет неявно объявлять эти функции-члены для типа класса, если программа не объявляет их явно, за исключением случаев, отмеченных в 12.1. Реализация будет неявно определять их, если они используются, как указано в 12.1, 12.4 и 12.8. Программы не должны определять неявно объявленные специальные функции-члены. Программы могут явно ссылаться на неявно объявленные специальные функции-члены. [Пример: программа может явно вызвать, взять адрес или сформировать указатель на член неявно объявленной специальной функции-члена.