Что такое определение, объявление и инициализация переменной
Объясните пожалуйста доступно, что такое определение, объявление и инициализация переменной. Как их отличать синтаксически. Что без чего можно делать, а что без чего нельзя. Прочитал уже несколько статей, теперь в голове только каша
Отслеживать
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 студентов
Наши выпускники работают в компаниях: