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

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

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

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

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

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

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

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

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

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

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

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

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

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

объявления - C++
в чем отличие такого определения float var = 1.f; от такого float var = 1.0f;

Объявления массива. - C++
Как увеличить количество переменных в массиве?

42
Croessmah
Эксперт CЭксперт С++
13406 / 7556 / 853
Регистрация: 27.09.2012
Сообщений: 18,590
Записей в блоге: 3
Завершенные тесты: 1
27.06.2013, 02:55 #16
Цитата Сообщение от alsav22 Посмотреть сообщение
int a; // неинициализированная переменная
А про экземпляры класса в данном случае вообще лучше не вспоминать
0
alsav22
5421 / 4816 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
27.06.2013, 03:10 #17
Или, например, у Лафоре (скрин). Раз "возможна одновременно с их объялением", то из этого следует, что есть и другие вараианты инициализации (не одновременно с объявлением).
0
Миниатюры
Отличие объявления, определения и инициализации  
Croessmah
Эксперт CЭксперт С++
13406 / 7556 / 853
Регистрация: 27.09.2012
Сообщений: 18,590
Записей в блоге: 3
Завершенные тесты: 1
27.06.2013, 08:37 #18
@alsav22, Думаю, имеется ввиду задание начального правильного значения, а это и есть инициализация, но только различие в том, какой механизм используется - механизм инициализации или механизм присвоения
0
rangerx
1933 / 1542 / 141
Регистрация: 31.05.2009
Сообщений: 2,913
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
alsav22
5421 / 4816 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
27.06.2013, 13:14 #21
Цитата Сообщение от Croessmah Посмотреть сообщение
задание начального правильного значения, а это и есть инициализация
Тогда дейстие в коде (15 пост) можно назвать инициализацией (с применением механизма присваивания)?
Цитата Сообщение от Croessmah Посмотреть сообщение
но только различие в том, какой механизм используется - механизм инициализации или механизм присвоения
Отличие в том, что в механизме инициализации используются конструкторы?
0
Croessmah
Эксперт CЭксперт С++
13406 / 7556 / 853
Регистрация: 27.09.2012
Сообщений: 18,590
Записей в блоге: 3
Завершенные тесты: 1
27.06.2013, 13:50 #22
@alsav22, Ну на счет механизмов это я просто так выразился, корректнее, наверное, сказать по другому:
C++
1
int a(1024);//инициализация
C++
1
2
int a;//создаем со значением по умолчанию (в данном случае с мусором)
a=1024;//не инициализация, а присвоение начального значения.
имхо, так будет правильнее
второй случай - инициализация с точки зрения определения инициализации и присвоение с точки зрения языка.
С классами же все совершенно очевидно, ибо при создании будет вызван конструктор, который и должен инициализировать объект, а при присвоении будет вызван оператор присвоения.
0
SatanaXIII
Супер-модератор
Эксперт С++
5616 / 2651 / 246
Регистрация: 01.11.2011
Сообщений: 6,530
Завершенные тесты: 1
27.06.2013, 14:05 #23
Я прошу прощения если не в тему, но нельзя ли перефразировать так:
C++
1
int a;//инициализация мусором
?

0
Croessmah
Эксперт CЭксперт С++
13406 / 7556 / 853
Регистрация: 27.09.2012
Сообщений: 18,590
Записей в блоге: 3
Завершенные тесты: 1
27.06.2013, 14:10 #24
@SatanaXIII, Как, правило, нельзя, ибо нет никакой инициализации - просто выделение места с тем значением, которое будет в памяти валяться то есть создание без задания какого-либо значения, имхо.
0
SatanaXIII
Супер-модератор
Эксперт С++
5616 / 2651 / 246
Регистрация: 01.11.2011
Сообщений: 6,530
Завершенные тесты: 1
27.06.2013, 14:26 #25
Цитата Сообщение от Croessmah Посмотреть сообщение
то есть создание без задания какого-либо значения, имхо.
то есть создание без задания какого-либо конкретного значения
0
Убежденный
Системный программист
Эксперт С++
15616 / 7125 / 1127
Регистрация: 02.05.2013
Сообщений: 11,564
Записей в блоге: 1
Завершенные тесты: 1
27.06.2013, 14:45 #26
Цитата Сообщение от SatanaXIII Посмотреть сообщение
int a;//инициализация мусором
Это не всегда верно.
Для объектов со статическим временем жизни (static storage duration)
выполняется так называемая инициализация нулем (zero-initialization).
C++
1
2
3
4
5
6
7
8
int a; // Будет равно нулю.
 
int main()
{
    int b; // А вот здесь будет мусор.
 
    return 0;
}
0
alsav22
5421 / 4816 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
27.06.2013, 14:51 #27
Цитата Сообщение от Croessmah Посмотреть сообщение
С классами же все совершенно очевидно, ибо при создании будет вызван конструктор, который и должен инициализировать объект
Предположим, был вызван конструктор по умолчанию, который ничего не сделал и в полях объекта остался мусор. Объект всё равно считается инициализированным? Или нет? Почему тогда:
C++
1
int a; // неинициализированный объект
Ведь то же самое (может даже и конструктор по умолчанию вызывается).
0
Croessmah
Эксперт CЭксперт С++
13406 / 7556 / 853
Регистрация: 27.09.2012
Сообщений: 18,590
Записей в блоге: 3
Завершенные тесты: 1
27.06.2013, 14:57 #28
@alsav22, Конструктор предназначен для инициализации объекта. Он вызван, значит объект можно назвать инициализированным, а то, что программист делает в конструкторе всем наплевать главное, чтобы порносайты при этом не открывались
0
Tulosba
:)
Эксперт С++
4396 / 3232 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
27.06.2013, 14:58 #29
Цитата Сообщение от Убежденный Посмотреть сообщение
int b; // А вот здесь будет мусор.
В общем случае, да. Но на старинном ваткоме в отладочном режиме инициализировалось нулями, насколько я помню. Да и https://ideone.com/uGgHt1 дает 0. Короче говоря, "мусорное" значение вполне детерминированно может быть нулём. Но безусловно это всё не регламентируется стандартом.
0
Убежденный
Системный программист
Эксперт С++
15616 / 7125 / 1127
Регистрация: 02.05.2013
Сообщений: 11,564
Записей в блоге: 1
Завершенные тесты: 1
27.06.2013, 15:26 #30
Цитата Сообщение от Tulosba Посмотреть сообщение
Но безусловно это всё не регламентируется стандартом.
Если быть совсем дотошным, то вот:
C++ 2003

8.5 Initializers

...

6. Every object of static storage duration shall be zero-initialized at program
startup before any other initialization takes place.

...

9. If no initializer is specified for an object, and the object is of (possibly cv-qualified)
non-POD class type (or array thereof), the object shall be default-initialized; if the
object is of const-qualified type, the underlying class type shall have a user-declared
default constructor. Otherwise, if no initializer is specified for a non-static
object, the object and its subobjects, if any, have an indeterminate initial value
.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.06.2013, 15:26
Привет! Вот еще темы с ответами:

Объявления классов - C++
Класс может быть объявлен так: class MyClass { ... }; а может быть объявлен и так typedef class

Ошибки объявления - C++
Stack.h #pragma once class Stack { public: void push (StackPtr *,int); int pop(StackPtr*); int isEmpty(StackPtr);

Вылетает из-за объявления указателя - C++
Unhandled exception at 0x010C3A8D in game_1.exe: 0xC0000005: Access violation reading location 0xCDCDCDCD. Source.cpp: ...

Особенность объявления функции - C++
Собсно вопрос такой , зачем нужно объявлять функции если их можно просто определять? связано ли это с компилятором?


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

Или воспользуйтесь поиском по форуму:
30
Yandex
Объявления
27.06.2013, 15:26
Ответ Создать тему
Опции темы

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