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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 29, средняя оценка - 4.66
_Cherep_
1 / 1 / 0
Регистрация: 02.08.2012
Сообщений: 15
#1

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

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

Здравствуйте, товарищи.

Читаю тут книжицу по 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++ Объявления классов
C++ Особенность объявления функции
объявления друг в друге C++
Ошибки объявления C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Croessmah
Модератор
Эксперт CЭксперт С++
12882 / 7268 / 810
Регистрация: 27.09.2012
Сообщений: 17,958
Записей в блоге: 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
Модератор
Эксперт CЭксперт С++
12882 / 7268 / 810
Регистрация: 27.09.2012
Сообщений: 17,958
Записей в блоге: 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
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
3130 / 1905 / 285
Регистрация: 27.08.2010
Сообщений: 5,132
Записей в блоге: 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
5415 / 4811 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
27.06.2013, 01:55     Отличие объявления, определения и инициализации #10
Присваивание значения в момент объявления переменной - это инициализация (не в момент объявления - просто присваивание). При объялении под переменную не выделяется память (только задаётся имя и тип), при определении выделяется. Большинство объявлений простых переменных являются и определениями, т.е. под них выделяется память.

Добавлено через 6 минут
Чтобы сделать только объявление переменной, нужно использовать слово extern:
C++
1
extern int a; // только объявление (память не выделяется)
Добавлено через 3 минуты
Объявлений переменной, в программе, может быть сколько угодно, определение только одно.
BumerangSP
4284 / 1406 / 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
5415 / 4811 / 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
5415 / 4811 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
27.06.2013, 02:51     Отличие объявления, определения и инициализации #15
Может быть и не стоит, но если по логике...
C++
1
2
3
4
 
int a; // неинициализированная переменная
a = 5; // после этого переменная уже не называется неинициализированной
       // значит это инициализация?
Croessmah
Модератор
Эксперт CЭксперт С++
12882 / 7268 / 810
Регистрация: 27.09.2012
Сообщений: 17,958
Записей в блоге: 2
Завершенные тесты: 1
27.06.2013, 02:55     Отличие объявления, определения и инициализации #16
Цитата Сообщение от alsav22 Посмотреть сообщение
int a; // неинициализированная переменная
А про экземпляры класса в данном случае вообще лучше не вспоминать
alsav22
5415 / 4811 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
27.06.2013, 03:10     Отличие объявления, определения и инициализации #17
Или, например, у Лафоре (скрин). Раз "возможна одновременно с их объялением", то из этого следует, что есть и другие вараианты инициализации (не одновременно с объявлением).
Миниатюры
Отличие объявления, определения и инициализации  
Croessmah
Модератор
Эксперт CЭксперт С++
12882 / 7268 / 810
Регистрация: 27.09.2012
Сообщений: 17,958
Записей в блоге: 2
Завершенные тесты: 1
27.06.2013, 08:37     Отличие объявления, определения и инициализации #18
@alsav22, Думаю, имеется ввиду задание начального правильного значения, а это и есть инициализация, но только различие в том, какой механизм используется - механизм инициализации или механизм присвоения
rangerx
1931 / 1540 / 141
Регистрация: 31.05.2009
Сообщений: 2,905
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++
C++ Вылетает из-за объявления указателя
C++ В чём отличие разных способов объявления переменных?

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

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

Не по теме:

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

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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru