Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.95/103: Рейтинг темы: голосов - 103, средняя оценка - 4.95
1 / 1 / 0
Регистрация: 02.08.2012
Сообщений: 15

Отличие объявления, определения и инициализации

26.06.2013, 23:57. Показов 21188. Ответов 42
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, товарищи.

Читаю тут книжицу по C++, учусь потихоньку.
И возник у меня вопрос нерядового характера: в чём фундаментальное отличие объявления, определения и инициализации? В книге всё намешано, ничего не понятненько.

Однако усёк, что они говаривают, будто такая строка:
C++
1
int a = 3;
не просто присваивание переменной значения, а что-то большее.
И как-то это связано с созданием экземпляров классов.

А ещё пишут, что есть инициализация прямая и инициализация копии.
А потом вот это кажут:
C++
1
2
int val = 1024;
int val (1024);
И говаривают, будто val в обоих случаях будет одинаковой.

Что-то я видно не секу истинной сути.
Помогите словцом мудрым.
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
26.06.2013, 23:57
Ответы с готовыми решениями:

Правила объявления инициализации
Напишите основные - самые главные правила обьявления инициализации.

В чём отличие разных способов объявления переменных?
в чем отличие int a(2); от int a=2; И как писать правильней

Сложные определения и объявления
Решил создать отдельный топик т.к. ну совсем никак не могу разобраться (все взято с книги) есть вот такая штука void * ...

42
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
27.06.2013, 00:00
Цитата Сообщение от _Cherep_ Посмотреть сообщение
не просто присваивание переменной значения, а что-то большее.
инициализация. Можете расценивать как
C++
1
int a(3);
0
1 / 1 / 0
Регистрация: 02.08.2012
Сообщений: 15
27.06.2013, 00:09  [ТС]
А разница-то в чём между инициализацией, объявлением и определением?
И какой смысл иметь две разные штуки для одного и того же:
C++
1
2
int val = 1024;
int val (1024);
0
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
27.06.2013, 00:18
Цитата Сообщение от _Cherep_ Посмотреть сообщение
А разница-то в чём между инициализацией, объявлением и определением?
Вопрос чем они связаны
Цитата Сообщение от _Cherep_ Посмотреть сообщение
И какой смысл иметь две разные штуки для одного и того же:
а какой смысл иметь черный чай и зеленый, все равно трава
0
1 / 1 / 0
Регистрация: 02.08.2012
Сообщений: 15
27.06.2013, 00:24  [ТС]
Цитата Сообщение от Croessmah Посмотреть сообщение
а какой смысл иметь черный чай и зеленый, все равно трава
Найн, зелёный чай невкусный и вообще фу-фу-фу, а чёрный хорош.
Но для чего-то же есть разница между двумя теми строками.

И да, чем связаны инициализация, объявление и определение?
0
 Аватар для msifeed
0 / 0 / 0
Регистрация: 04.06.2013
Сообщений: 10
27.06.2013, 00:26
C++
1
2
3
4
5
6
7
class foo {
public: //Не обращай внимания с:
   int a; //Объявление
   foo(int _a) : a(_a) {} //Это функция конструктора, которая вызывается при создании переменной класса
};
 
foo a(5);
Это означает, что будет объявлен и инициализирован класс foo, причем инициализирован со значением 5. Это значение попадет классу в переменную a. Вот зачем нужны скобочки.

Согласно смыслу этих трех слов, можно предположить что они означают
Объявление - мы говорим что переменная будет.
Определение - мы указываем какой она будет.
Инициализации - тут мы используем скобочки, которые "запускают" переменную через конструктор.
Инициализация - это определение, но определение не инициализация(в какой-то мере).
Вероятно это так.
0
11 / 11 / 2
Регистрация: 20.05.2011
Сообщений: 71
27.06.2013, 00:26
объявление:
int a;
инициализация:
int a = 5; int a(5);
присваивание(определение):
a=5;
1
3176 / 1935 / 312
Регистрация: 27.08.2010
Сообщений: 5,131
Записей в блоге: 1
27.06.2013, 00:31
Лучший ответ Сообщение было отмечено как решение

Решение

Цитата Сообщение от _Cherep_ Посмотреть сообщение
чем связаны инициализация, объявление и определение
1. Заходите в бар, и говорите бармену, что вы крутой мэн, у которого есть деньги на выпивку.
Это декларация.

2. Достаете из портмоне $100 и помахиваете ими у бармена перед носом.
Это дефиниция.

3. Напиваетесь на все.
Это инициализация.
9
1 / 1 / 0
Регистрация: 02.08.2012
Сообщений: 15
27.06.2013, 00:35  [ТС]
Спасибо, товарищи.
Дело вроде прояснилось
0
5499 / 4894 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
27.06.2013, 01:55
Присваивание значения в момент объявления переменной - это инициализация (не в момент объявления - просто присваивание). При объялении под переменную не выделяется память (только задаётся имя и тип), при определении выделяется. Большинство объявлений простых переменных являются и определениями, т.е. под них выделяется память.

Добавлено через 6 минут
Чтобы сделать только объявление переменной, нужно использовать слово extern:
C++
1
extern int a; // только объявление (память не выделяется)
Добавлено через 3 минуты
Объявлений переменной, в программе, может быть сколько угодно, определение только одно.
4
 Аватар для BumerangSP
4311 / 1423 / 463
Регистрация: 16.12.2010
Сообщений: 2,939
Записей в блоге: 3
27.06.2013, 02:00
По поводу инициализации:
C++
1
2
3
int a = 10;
int a1(10);
int a2 = int(10);
Все это приведет к инициализации переменных числом 10.
Такой вот синтаксис (где числа в скобках) придуман для внешнего сходства с инициализацией объектов. Тут будто у них конструкторы вызываются, как у объектов пользовательских типов, но на самом деле это тоже самое присваивание.
0
1 / 1 / 0
Регистрация: 02.08.2012
Сообщений: 15
27.06.2013, 02:23  [ТС]
@alsav22, спасибо, чётко всё разложили
0
5499 / 4894 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
27.06.2013, 02:46
Цитата Сообщение от _Cherep_ Посмотреть сообщение
@alsav22, спасибо, чётко всё разложили
Но насчёт определения инициализации мучают сомнения... Вот такой вариант тоже хочется назвать инициализацией:
C++
1
2
int a;
a = 5;
То есть, присвоение значение переменной, у которой значение отсутствует (неинициализированная переменная).
0
27.06.2013, 02:47

Не по теме:

Цитата Сообщение от alsav22 Посмотреть сообщение
Вот такой вариант тоже хочется назвать инициализацией:
но всё-таки лучше не стоит этого делать :)

0
5499 / 4894 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
27.06.2013, 02:51
Может быть и не стоит, но если по логике...
C++
1
2
3
4
 
int a; // неинициализированная переменная
a = 5; // после этого переменная уже не называется неинициализированной
       // значит это инициализация?
0
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
27.06.2013, 02:55
Цитата Сообщение от alsav22 Посмотреть сообщение
int a; // неинициализированная переменная
А про экземпляры класса в данном случае вообще лучше не вспоминать
0
5499 / 4894 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
27.06.2013, 03:10
Или, например, у Лафоре (скрин). Раз "возможна одновременно с их объялением", то из этого следует, что есть и другие вараианты инициализации (не одновременно с объявлением).
Миниатюры
Отличие объявления, определения и инициализации  
0
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
27.06.2013, 08:37
@alsav22, Думаю, имеется ввиду задание начального правильного значения, а это и есть инициализация, но только различие в том, какой механизм используется - механизм инициализации или механизм присвоения
0
2022 / 1621 / 489
Регистрация: 31.05.2009
Сообщений: 3,005
27.06.2013, 11:01
Цитата Сообщение от _Cherep_ Посмотреть сообщение
И какой смысл иметь две разные штуки для одного и того же:
C++
1
2
int val = 1024;
int val (1024)
Второй вариант сделан для придания единой формы записи с конструкторами пользовательских типов. Это важно как для списков инициализации классов
C++
1
2
3
4
5
6
7
8
9
10
11
class SomeClass
{
public:
    explicit SomeClass(int value)
        : _value(value) // инициализация переменной _value
    {
    }
 
private:
    int _value;
};
так и для переменных тип которых является параметром шаблона
C++
1
2
3
4
5
6
7
8
template <typename T>
class Array
{
public:
    // const T& init = T() - инициализация переменной init значением по умолчанию типа T
    explicit Array(std::size_t size, const T& init = T()); 
    //...
};
2
27.06.2013, 11:34

Не по теме:

@rangerx, для большей наглядности я бы в первом примере сделал поле константным (или ссылочным):

C++
1
const int _value;
Иначе инициализировать значение можно и в теле конструктора через присваивание.

1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
27.06.2013, 11:34
Помогаю со студенческими работами здесь

Объявления и определения структур
Может кто-нибудь объяснить как это работает: //Source1.cpp #include &quot;pch.h&quot; #include &lt;iostream&gt; using namespace std; ...

Циклы for. Проблема объявления/инициализации
Эх, так и придется создавать новую тему. А то, блин, интересно ж... Итак, я тут в недавней теме утверждал, что блок инициализации цикла...

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

Когда выделяется память под переменные - во время объявления или инициализации
Привет! Вопрос такой: когда выделяется память под переменные - во время объявления или инициализации?

Архитектура правильного определения и объявления класса
Всем привет! В процессе написания одной программы &quot;поймал&quot; себя на том, что видимо не до конца понимаю логику правильного определения...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru