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

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

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

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

26.06.2013, 23:57. Просмотров 4553. Ответов 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Эксперт С++
13512 / 7670 / 866
Регистрация: 27.09.2012
Сообщений: 18,870
Записей в блоге: 3
Завершенные тесты: 1
27.06.2013, 00:00 #2
Цитата Сообщение от _Cherep_ Посмотреть сообщение
не просто присваивание переменной значения, а что-то большее.
инициализация. Можете расценивать как
C++
1
int a(3);
0
_Cherep_
1 / 1 / 0
Регистрация: 02.08.2012
Сообщений: 15
27.06.2013, 00:09  [ТС] #3
А разница-то в чём между инициализацией, объявлением и определением?
И какой смысл иметь две разные штуки для одного и того же:
C++
1
2
int val = 1024;
int val (1024);
0
Croessmah
Эксперт CЭксперт С++
13512 / 7670 / 866
Регистрация: 27.09.2012
Сообщений: 18,870
Записей в блоге: 3
Завершенные тесты: 1
27.06.2013, 00:18 #4
Цитата Сообщение от _Cherep_ Посмотреть сообщение
А разница-то в чём между инициализацией, объявлением и определением?
Вопрос чем они связаны
Цитата Сообщение от _Cherep_ Посмотреть сообщение
И какой смысл иметь две разные штуки для одного и того же:
а какой смысл иметь черный чай и зеленый, все равно трава
0
_Cherep_
1 / 1 / 0
Регистрация: 02.08.2012
Сообщений: 15
27.06.2013, 00:24  [ТС] #5
Цитата Сообщение от Croessmah Посмотреть сообщение
а какой смысл иметь черный чай и зеленый, все равно трава
Найн, зелёный чай невкусный и вообще фу-фу-фу, а чёрный хорош.
Но для чего-то же есть разница между двумя теми строками.

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

Согласно смыслу этих трех слов, можно предположить что они означают
Объявление - мы говорим что переменная будет.
Определение - мы указываем какой она будет.
Инициализации - тут мы используем скобочки, которые "запускают" переменную через конструктор.
Инициализация - это определение, но определение не инициализация(в какой-то мере).
Вероятно это так.
0
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;
0
gazlan
3133 / 1909 / 285
Регистрация: 27.08.2010
Сообщений: 5,132
Записей в блоге: 1
27.06.2013, 00:31 #8
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от _Cherep_ Посмотреть сообщение
чем связаны инициализация, объявление и определение
1. Заходите в бар, и говорите бармену, что вы крутой мэн, у которого есть деньги на выпивку.
Это декларация.

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

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

Добавлено через 6 минут
Чтобы сделать только объявление переменной, нужно использовать слово extern:
C++
1
extern int a; // только объявление (память не выделяется)
Добавлено через 3 минуты
Объявлений переменной, в программе, может быть сколько угодно, определение только одно.
3
BumerangSP
4286 / 1408 / 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.
Такой вот синтаксис (где числа в скобках) придуман для внешнего сходства с инициализацией объектов. Тут будто у них конструкторы вызываются, как у объектов пользовательских типов, но на самом деле это тоже самое присваивание.
0
_Cherep_
1 / 1 / 0
Регистрация: 02.08.2012
Сообщений: 15
27.06.2013, 02:23  [ТС] #12
@alsav22, спасибо, чётко всё разложили
0
alsav22
5425 / 4820 / 442
Регистрация: 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
alsav22
5425 / 4820 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
27.06.2013, 02:51 #15
Может быть и не стоит, но если по логике...
C++
1
2
3
4
 
int a; // неинициализированная переменная
a = 5; // после этого переменная уже не называется неинициализированной
       // значит это инициализация?
0
27.06.2013, 02:51
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.06.2013, 02:51
Привет! Вот еще темы с ответами:

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


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

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