1 / 1 / 0
Регистрация: 02.08.2012
Сообщений: 15
|
|||||||||||
1 | |||||||||||
Отличие объявления, определения и инициализации26.06.2013, 23:57. Показов 19127. Ответов 42
Метки нет (Все метки)
Здравствуйте, товарищи.
Читаю тут книжицу по C++, учусь потихоньку. И возник у меня вопрос нерядового характера: в чём фундаментальное отличие объявления, определения и инициализации? В книге всё намешано, ничего не понятненько. Однако усёк, что они говаривают, будто такая строка:
И как-то это связано с созданием экземпляров классов. А ещё пишут, что есть инициализация прямая и инициализация копии. А потом вот это кажут:
Что-то я видно не секу истинной сути. Помогите словцом мудрым.
0
|
26.06.2013, 23:57 | |
Ответы с готовыми решениями:
42
Правила объявления инициализации В чём отличие разных способов объявления переменных? Сложные определения и объявления Объявления и определения структур |
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
|
|
27.06.2013, 13:14 | 21 |
Тогда дейстие в коде (15 пост) можно назвать инициализацией (с применением механизма присваивания)?
Отличие в том, что в механизме инициализации используются конструкторы?
0
|
Неэпический
|
|||||||||||
27.06.2013, 13:50 | 22 | ||||||||||
@alsav22, Ну на счет механизмов это я просто так выразился, корректнее, наверное, сказать по другому:
второй случай - инициализация с точки зрения определения инициализации и присвоение с точки зрения языка. С классами же все совершенно очевидно, ибо при создании будет вызван конструктор, который и должен инициализировать объект, а при присвоении будет вызван оператор присвоения.
0
|
Почетный модератор
5850 / 2861 / 392
Регистрация: 01.11.2011
Сообщений: 6,907
|
||||||
27.06.2013, 14:05 | 23 | |||||
Я прошу прощения если не в тему, но нельзя ли перефразировать так:
0
|
Неэпический
|
|
27.06.2013, 14:10 | 24 |
@SatanaXIII, Как, правило, нельзя, ибо нет никакой инициализации - просто выделение места с тем значением, которое будет в памяти валяться то есть создание без задания какого-либо значения, имхо.
0
|
Почетный модератор
5850 / 2861 / 392
Регистрация: 01.11.2011
Сообщений: 6,907
|
|
27.06.2013, 14:26 | 25 |
0
|
Ушел с форума
|
||||||
27.06.2013, 14:45 | 26 | |||||
Это не всегда верно.
Для объектов со статическим временем жизни (static storage duration) выполняется так называемая инициализация нулем (zero-initialization).
0
|
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
|
||||||
27.06.2013, 14:51 | 27 | |||||
Предположим, был вызван конструктор по умолчанию, который ничего не сделал и в полях объекта остался мусор. Объект всё равно считается инициализированным? Или нет? Почему тогда:
0
|
Неэпический
|
|
27.06.2013, 14:57 | 28 |
@alsav22, Конструктор предназначен для инициализации объекта. Он вызван, значит объект можно назвать инициализированным, а то, что программист делает в конструкторе всем наплевать главное, чтобы порносайты при этом не открывались
0
|
:)
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
|
|
27.06.2013, 14:58 | 29 |
В общем случае, да. Но на старинном ваткоме в отладочном режиме инициализировалось нулями, насколько я помню. Да и https://ideone.com/uGgHt1 дает 0. Короче говоря, "мусорное" значение вполне детерминированно может быть нулём. Но безусловно это всё не регламентируется стандартом.
0
|
Ушел с форума
|
|
27.06.2013, 15:26 | 30 |
0
|
Комп_Оратор)
|
|
27.06.2013, 16:23 | 32 |
Неверных инициализаций не бывает. То есть взаимно это как-то.
Вообще, для новичка такие вещи как объявление, определение и инициализация, - предварительное объявление, как и многое другое. Нельзя язык учить как букварь, многое можно понять значительно позже ознакомления. @_Cherep_, объявление это информация для компилятора для формирования кода. С местом объявления связаны: время жизни, видимости, действия переменной, например. Определение - информация компилятору и редактору связей для конкретизации значения или адреса. Инициализация - совмещение, того и другого. Тема большая. Вам пока достаточно понять, что константы и ссылки, невозможно объявить без инициализации. А уж как работают конструктора при инициализации или присваивании это лучше читать и спрашивать конкретно.
0
|
Модератор
|
||||||||||||||||
27.06.2013, 16:47 | 33 | |||||||||||||||
В C++ есть такие понятия:
1) объявление (декларация) 2) определение (дефиниция) Пояснить что есть что, проще всего на примере функций:
Этот код не скомпилируется, т.к. в момент компиляции F1 компилятор ничего не знает про F2. Чтобы код скомпилировался, функцию F2 нужно предварительно объявить (декларировать):
Ну, а инициализация - это присвоение объекту или переменной некоего значения в момент создания.
1
|
Комп_Оратор)
|
||||||
27.06.2013, 17:43 | 35 | |||||
Это правда. Тем не менее может же быть случай когда переменная должна быть объявлена и не может быть проинициализирована полностью. Например если классы связны указателями друг на друга.
Новичку это ненужно. :
0
|
:)
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
|
||||||
27.06.2013, 17:49 | 36 | |||||
В таком случае следует инициализировать неким нулевым значением, которое будет четко говорить, что поле не инициализировано. А не оставлять его в "мусорном" состоянии. Например должно быть как минимум так:
1
|
Комп_Оратор)
|
|
27.06.2013, 18:01 | 38 |
Может и правда. А если, ход выполнения одного из методов инициализации зависим от значения поля? Или поле - файловый поток, например?
Конечно если слить такие классы в один, то такой вопрос обходится, а если не нет? У меня маловато опыта, чтобы сказать определённо. Добавлено через 4 минуты Не может быть. Сейчас заметил: в заголовке typeinfo,h забыл удалить и вообще сырой кусок.
0
|
Комп_Оратор)
|
|
27.06.2013, 18:39 | 40 |
0
|
27.06.2013, 18:39 | |
27.06.2013, 18:39 | |
Помогаю со студенческими работами здесь
40
Циклы for. Проблема объявления/инициализации Написать программу объявления, создания и инициализации двумерного прямоугольного массива Когда выделяется память под переменные - во время объявления или инициализации Архитектура правильного определения и объявления класса Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |