Перейти к содержимому

Что такое инициализация в программировании

  • автор:

Что такое определение, объявление и инициализация переменной

Объясните пожалуйста доступно, что такое определение, объявление и инициализация переменной. Как их отличать синтаксически. Что без чего можно делать, а что без чего нельзя. Прочитал уже несколько статей, теперь в голове только каша

Отслеживать
123k 24 24 золотых знака 126 126 серебряных знаков 303 303 бронзовых знака
задан 13 июн 2020 в 12:45
221 1 1 золотой знак 3 3 серебряных знака 12 12 бронзовых знаков
Чтобы каши в голове не было, лучше читать учебники.
13 июн 2020 в 12:47
@SergeyGornostaev посоветуй, пожалйста книгу, где можно об этом почитать
13 июн 2020 в 12:59

Приведённые раньше ответы неверные. Уже неоднократно поднималась эта тема на стеках. Вот пример правильного ответа stackoverflow.com/a/1410632. Также можно почитать тут en.cppreference.com/w/cpp/language/declarations, en.cppreference.com/w/cpp/language/definition. Ну и в Стандарте, разумеется eel.is/c++draft.

13 июн 2020 в 13:06
@Slad, если вам нужны формально точные определения, тогда берите стандарт языка.
13 июн 2020 в 13:22
7 июл 2020 в 13:16

1 ответ 1

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

Нижеизложенное сильно упрощено. Здесь не преследуется цель рассказать подробно все нюансы — для этого лучше почитать Стандарт языка.

Объявление (declaration) переменной информирует компилятор о том, что где-то, возможно, в другой единице трансляции (очень грубо, в другом cpp-файле) выделено sizeof байт под хранение переменной такого-то типа с таким-то именем. Деклараций можно писать сколько угодно в разных блоках кода, по одной на блок.

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

Этими процессами управляют квалификаторы static , extern , thread_local и некоторые другие.

Чаще всего, происходят одновременно объявление и определение, например

int a; // вне функций - заставит компилятор создать глобальную переменную. < int a; //в блоке кода - переменная будет существовать до конца блока, а память будет выделена на стеке >

Примером чисто объявления идентификатора будет объявление его со спецификатором static внутри структуры:

struct A < static int a; // объявление A::a >; 

Никакая память на данный момент не выделена, но компилятор теперь знает, что у него такое есть. Для использования этого поля необходимо прежде определить его вне структуры:

int A::a; // определение A::a int b = A::a; // теперь можно 

Использование ключевого слова extern , которое как раз говорит компилятору, что переменная объявлена где-то в другой единице трансляции

 //alpha.cpp int a; //beta.cpp extern int a; // указали, что будем пользоваться `int a` из `alpha.cpp` 

Само связывание имен и памяти произойдет на этапе компоновки программы.

Инициализация в смысле C++ — это когда определение и объявление объединяют с присваиванием начального значения;

Будет инициализацией в смысле практики программирования (самая первая запись в переменную), но не будет инициализацией в смысле C++ — это идущие подряд определение и присваивание.

Чтение из неинициализированной переменной — форменное UB. Так писать нельзя, это неправильно.

Зачем нужна инициализация в программировании? Какие есть виды инициализации?

Что Вы подразумеваете под термином инициализация? Переменные, классы, массивы? Если Вас интересует инициализация переменных — это можно так сказать процесс присваивания каких-либо данных или процесс внесения информация с клавиатуры. Если же Вас интересуют классы .. то инициализация класса — это точка входа в проект . Вот в Java программирование без объявления (инициализации) класса Вам никак не обойтись . Так как класс в Java — это есть точка вход в проект .

-Egor-Мыслитель (6172) 9 лет назад

точка входа в Java это статический метод, никакой инициализации класса там нету.

Инициализация в большенстве языков програмирования — это процесс подготовки (выделение) памяти под программные нужды . Бывает статическая и динамическая. Статическая подготавливает память сразу же на запуске программы, динамическая по необходимосте (по какому то сигналу от программы)
Как из простых примеров : обьявления массива и каких либо констант . в разных языках синтаксис разный в паскале это область var, в java это либо конструктор класса либо статическая область static<>

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

Инициализация

Инициализация (от англ. initialization, инициирование) — создание, активация, подготовка к работе, определение параметров. Приведение программы или устройства в состояние готовности к использованию. [1]

Термин употребляется как для программных, так и для аппаратных средств.

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

Примеры

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

См. также

  • Отложенная инициализация (шаблон проектирования)
  • Инициация

Примечания

  • Найти и оформить в виде сносок ссылки на авторитетные источники, подтверждающие написанное.
  • Дополнить статью (статья слишком короткая либо содержит лишь словарное определение).
  • Компьютер

Wikimedia Foundation . 2010 .

Синонимы:

Полезное

Смотреть что такое «Инициализация» в других словарях:

  • инициализация — инициирование Словарь русских синонимов. инициализация сущ., кол во синонимов: 2 • инициирование (4) • … Словарь синонимов
  • инициализация — Приведение областей памяти в состояние, исходное для последующей обработки или размещения данных. [ГОСТ 19781 90] инициализация Присваивание начальных значений переменным программы [ГОСТ 28397 89] Тематики обеспеч. систем обраб. информ.… … Справочник технического переводчика
  • Инициализация — 37. Инициализация Initialize Присваивание начальных значений переменным программы Источник: ГОСТ 28397 89: Языки программирования. Термины и определения оригинал документа 3. Инициализация Приведен … Словарь-справочник терминов нормативно-технической документации
  • инициализация — iniciacija statusas T sritis automatika atitikmenys: angl. initialization; initializing; initiating; initiation vok. Initialisieren, n; Initialisierung, f rus. инициализация, f; инициирование, n; присваивание начального значения, n pranc.… … Automatikos terminų žodynas
  • инициализация (периферийного устройства) — Операция, необходимая для установки периферийного устройства в исходное положение и выполняемая до начала использования носителя данных или начала реализации процесса. [Е.С.Алексеев, А.А.Мячев. Англо русский толковый словарь по системотехнике ЭВМ … Справочник технического переводчика
  • инициализация (спутникового приемника) — Процедура измерений для предварительного разрешения неоднозначности перед началом спутниковых определений в кинематическом режиме. [РТМ 68 14 01] Тематики спутниковая технология геодезических работ Обобщающие термины методы спутниковых… … Справочник технического переводчика
  • инициализация диска — Разметка диска и запись на него управляющей информации. [Е.С.Алексеев, А.А.Мячев. Англо русский толковый словарь по системотехнике ЭВМ. Москва 1993] Тематики информационные технологии в целом EN initializationdisk … Справочник технического переводчика
  • инициализация общего опроса — — [ГОСТ Р МЭК 60870 5 103 2005] Тематики телемеханика, телеметрия EN initiation of general interrogation … Справочник технического переводчика
  • инициализация периферийного устройства — Операция, необходимая для установки периферийного устройства в исходное положение и выполняемая до начала использования носителя данных или начала реализации процесса. [ГОСТ 25868 91] Тематики оборуд. перифер. систем обраб. информации EN… … Справочник технического переводчика
  • инициализация системы — — [Л.Г.Суменко. Англо русский словарь по информационным технологиям. М.: ГП ЦНИИС, 2003.] Тематики информационные технологии в целом EN system initialization … Справочник технического переводчика
  • Обратная связь: Техподдержка, Реклама на сайте
  • �� Путешествия

Экспорт словарей на сайты, сделанные на PHP,
WordPress, MODx.

  • Пометить текст и поделитьсяИскать в этом же словареИскать синонимы
  • Искать во всех словарях
  • Искать в переводах
  • Искать в ИнтернетеИскать в этой же категории

Инициализация и протоколы — Python: Введение в ООП

Теперь, когда вы знакомы со связанными методами, настало время рассказать про самый важный метод в Python: метод __init__ («dunder-init», «дандер инит»). Этот метод отвечает за инициализацию экземпляров класса после их создания.

На прошлых уроках Бобу — экземпляру класса Person , мы задавали имя уже после того, как сам объект был создан. Такое заполнение атрибутов объекта и выглядит громоздко и может приводить к разного рода ошибкам: объект может какое-то время находиться в «недозаполненном» (более общее название — «неконсистентном») состоянии. Инициализатор же позволяет получить уже полностью настроенный экземпляр.

Реализуем класс Person так, чтобы имя можно было указывать при создании объекта:

class Person: def __init__(self, name): self.name = name bob = Person('Bob') bob.name # 'Bob' alice = Person('Alice') alice.name # 'Alice' 

Теперь нет нужды иметь в классе атрибут name = ‘Noname’ , ведь все объекты получают имена при инстанцировании!

Методы и протоколы

Вы заметили, что Python сам вызывает метод __init__ в нужный момент? Это же касается большинства dunder-методов: таковые вы только объявляете, но вручную не вызываете. Такое поведение часто называют протоколом (или поведением): класс реализует некий протокол, предоставляя нужные dunder-методы. А Python, в свою очередь, работает с объектом посредством протокола.

Продемонстрирую протокол получения длины имени объекта:

class Person: def __init__(self, name): self.name = name def __len__(self): return len(self.name) tom = Person('Thomas') len(tom) # 6 

Я объявил метод dunder-len, и объекты класса Person научились возвращать «свою длину» (да, пример надуманный, но суть отражает). Вызов функции len на самом деле приводит к вызову метода __len__ у переданного в аргументе объекта!

Протоколы и «утиная типизация»

Существует такой термин: «утиная типизация» («duck typing») — «Если что-то крякает как утка и плавает как утка, то возможно это утка и есть!». Данный термин, пусть и звучит как шутка, описывает важный принцип построения абстракций: коду практически всегда достаточно знать о значении, с которым этот код работает, что это значение обладает нужными свойствами. Все остальное — не существенно.

Если коду достаточно знать, что сущность умеет плавать и крякать, то код не должен проверять сущность на фактическую принадлежность к уткам. Это позволит коду работать с робо-утками, даже если все настоящие утки вымрут, ведь код работает с абстрактными утками!

Открыть доступ

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

  • 130 курсов, 2000+ часов теории
  • 1000 практических заданий в браузере
  • 360 000 студентов

Наши выпускники работают в компаниях:

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *