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

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

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

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

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

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

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

Что-то я видно не секу истинной сути.
Помогите словцом мудрым.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.06.2013, 23:57
Ответы с готовыми решениями:

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

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

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

Объявления и определения структур
Может кто-нибудь объяснить как это работает: //Source1.cpp #include "pch.h" #include...

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

И да, чем связаны инициализация, объявление и определение?
0
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. Вот зачем нужны скобочки.

Согласно смыслу этих трех слов, можно предположить что они означают
Объявление - мы говорим что переменная будет.
Определение - мы указываем какой она будет.
Инициализации - тут мы используем скобочки, которые "запускают" переменную через конструктор.
Инициализация - это определение, но определение не инициализация(в какой-то мере).
Вероятно это так.
0
11 / 11 / 2
Регистрация: 20.05.2011
Сообщений: 71
27.06.2013, 00:26 7
объявление:
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 8
Лучший ответ Сообщение было отмечено как решение

Решение

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

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

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

Добавлено через 6 минут
Чтобы сделать только объявление переменной, нужно использовать слово extern:
C++
1
extern int a; // только объявление (память не выделяется)
Добавлено через 3 минуты
Объявлений переменной, в программе, может быть сколько угодно, определение только одно.
4
4311 / 1422 / 463
Регистрация: 16.12.2010
Сообщений: 2,939
Записей в блоге: 3
27.06.2013, 02:00 11
По поводу инициализации:
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  [ТС] 12
@alsav22, спасибо, чётко всё разложили
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
27.06.2013, 02:46 13
Цитата Сообщение от _Cherep_ Посмотреть сообщение
@alsav22, спасибо, чётко всё разложили
Но насчёт определения инициализации мучают сомнения... Вот такой вариант тоже хочется назвать инициализацией:
C++
1
2
int a;
a = 5;
То есть, присвоение значение переменной, у которой значение отсутствует (неинициализированная переменная).
0
Croessmah
27.06.2013, 02:47
  #14

Не по теме:

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

0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
27.06.2013, 02:51 15
Может быть и не стоит, но если по логике...
C++
1
2
3
4
 
int a; // неинициализированная переменная
a = 5; // после этого переменная уже не называется неинициализированной
       // значит это инициализация?
0
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,736
Записей в блоге: 1
27.06.2013, 02:55 16
Цитата Сообщение от alsav22 Посмотреть сообщение
int a; // неинициализированная переменная
А про экземпляры класса в данном случае вообще лучше не вспоминать
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
27.06.2013, 03:10 17
Или, например, у Лафоре (скрин). Раз "возможна одновременно с их объялением", то из этого следует, что есть и другие вараианты инициализации (не одновременно с объявлением).
Миниатюры
Отличие объявления, определения и инициализации  
0
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,736
Записей в блоге: 1
27.06.2013, 08:37 18
@alsav22, Думаю, имеется ввиду задание начального правильного значения, а это и есть инициализация, но только различие в том, какой механизм используется - механизм инициализации или механизм присвоения
0
2022 / 1621 / 489
Регистрация: 31.05.2009
Сообщений: 3,005
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()); 
    //...
};
2
Tulosba
27.06.2013, 11:34     Отличие объявления, определения и инициализации
  #20

Не по теме:

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

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

1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.06.2013, 11:34

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru