Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 29, средняя оценка - 4.66
_Cherep_
1 / 1 / 0
Регистрация: 02.08.2012
Сообщений: 15
26.06.2013, 23:57     Отличие объявления, определения и инициализации #1
Здравствуйте, товарищи.

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

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

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

Что-то я видно не секу истинной сути.
Помогите словцом мудрым.
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.06.2013, 23:57     Отличие объявления, определения и инициализации
Посмотрите здесь:

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

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

Согласно смыслу этих трех слов, можно предположить что они означают
Объявление - мы говорим что переменная будет.
Определение - мы указываем какой она будет.
Инициализации - тут мы используем скобочки, которые "запускают" переменную через конструктор.
Инициализация - это определение, но определение не инициализация(в какой-то мере).
Вероятно это так.
razor_ua
10 / 10 / 0
Регистрация: 20.05.2011
Сообщений: 71
27.06.2013, 00:26     Отличие объявления, определения и инициализации #7
объявление:
int a;
инициализация:
int a = 5; int a(5);
присваивание(определение):
a=5;
gazlan
2861 / 1809 / 272
Регистрация: 27.08.2010
Сообщений: 4,896
Записей в блоге: 1
27.06.2013, 00:31     Отличие объявления, определения и инициализации #8
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от _Cherep_ Посмотреть сообщение
чем связаны инициализация, объявление и определение
1. Заходите в бар, и говорите бармену, что вы крутой мэн, у которого есть деньги на выпивку.
Это декларация.

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

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

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

Не по теме:

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

alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
27.06.2013, 02:51     Отличие объявления, определения и инициализации #15
Может быть и не стоит, но если по логике...
C++
1
2
3
4
 
int a; // неинициализированная переменная
a = 5; // после этого переменная уже не называется неинициализированной
       // значит это инициализация?
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11828 / 6807 / 769
Регистрация: 27.09.2012
Сообщений: 16,878
Записей в блоге: 2
Завершенные тесты: 1
27.06.2013, 02:55     Отличие объявления, определения и инициализации #16
Цитата Сообщение от alsav22 Посмотреть сообщение
int a; // неинициализированная переменная
А про экземпляры класса в данном случае вообще лучше не вспоминать
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
27.06.2013, 03:10     Отличие объявления, определения и инициализации #17
Или, например, у Лафоре (скрин). Раз "возможна одновременно с их объялением", то из этого следует, что есть и другие вараианты инициализации (не одновременно с объявлением).
Миниатюры
Отличие объявления, определения и инициализации  
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11828 / 6807 / 769
Регистрация: 27.09.2012
Сообщений: 16,878
Записей в блоге: 2
Завершенные тесты: 1
27.06.2013, 08:37     Отличие объявления, определения и инициализации #18
@alsav22, Думаю, имеется ввиду задание начального правильного значения, а это и есть инициализация, но только различие в том, какой механизм используется - механизм инициализации или механизм присвоения
rangerx
1908 / 1517 / 139
Регистрация: 31.05.2009
Сообщений: 2,876
27.06.2013, 11:01     Отличие объявления, определения и инициализации #19
Цитата Сообщение от _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()); 
    //...
};
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.06.2013, 11:34     Отличие объявления, определения и инициализации
Еще ссылки по теме:

Ошибки объявления C++
C++ Архитектура правильного определения и объявления класса
Правила объявления инициализации C++

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

Или воспользуйтесь поиском по форуму:
Tulosba
27.06.2013, 11:34     Отличие объявления, определения и инициализации
  #20

Не по теме:

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

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

Yandex
Объявления
27.06.2013, 11:34     Отличие объявления, определения и инициализации
Ответ Создать тему
Опции темы

Текущее время: 01:29. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru