int x;int y;int * ptr;это не инициализация, верно? - PullRequest
0 голосов
/ 20 ноября 2018

Я читаю «C ++ All-in-One для чайников» Дж.П. Мюллера и Дж. Когсуэлла и наткнулся на это:

#include <iostream>
using namespace std;
int main()
{
    int ExpensiveComputer;
    int CheapComputer;
    int *ptrToComp;
...

Этот код начинается с инициализации всех вкусностейвовлечено - два целых числа и указатель на целое число.

Просто чтобы подтвердить, что это ошибка, она должна читать «... объявлением», верно?Мне просто странно, что такие основные ошибки все еще попадают в книги.

Ответы [ 4 ]

0 голосов
/ 20 ноября 2018

правый.Отсюда и «чайники».:)

Мы даже не можем винить в этом наследие;исторически C-программисты объявляли * переменную, а затем «инициализировали» ее позже с помощью первого присваивания.

Но никогда не было случая, чтобы простое объявление переменной без инициализатора считалось «инициализирующим» ее.. **

Таким образом, формулировка неверна.

* Технически мы говорим об определениях , но когда мы говорим "объявить переменную", мыпочти всегда означает определение объявлений.

** Хотя объекты со статической длительностью хранения проходят свою собственную фазу нулевой инициализации, прежде чем что-либо еще произойдет, поэтому отказ от инициализации самостоятельно не является катастрофой в этом случае,Тем не менее, мы не можем утверждать, что инициализировали этот объект.

0 голосов
/ 20 ноября 2018

Этот код объявляет и определяет три переменные, но не инициализирует их (их значения называются неопределенными ).

Объявление переменной должно содержать только ключевое слово extern.

0 голосов
/ 20 ноября 2018

С точки зрения языка это инициализация по умолчанию .Проблема в том, что они инициализируются неопределенными значениями.

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

По умолчаниюинициализация переменных, не относящихся к классам, с автоматической и динамической продолжительностью хранения приводит к созданию объектов с неопределенными значениями (статические и локальные для потока объекты инициализируются нулем)

Обратите внимание, что любая попытка прочитать эти неопределенные значения приводит к UB .

Из стандарта [dcl.init] / 7

Инициализация по умолчанию объекта типа T означает:

  • Если T является (возможно, cv-квалифицированным) типом класса ([class]), рассматриваются конструкторы.Применимые конструкторы перечисляются ([over.match.ctor]), и лучший для инициализатора () выбирается с помощью разрешения перегрузки ([over.match]).Выбранный таким образом конструктор вызывается с пустым списком аргументов для инициализации объекта.

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

  • В противном случае инициализация не выполняется.

0 голосов
/ 20 ноября 2018

Да, вы правы.

Вы объявили и определили эти переменные, вы не инициализировали их!

PS: В чем разница между определением и декларацией?

...