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

Разница между определением и объявлением переменной - C++

Восстановить пароль Регистрация
 
DieMore
3 / 3 / 2
Регистрация: 21.08.2014
Сообщений: 17
22.08.2014, 13:06     Разница между определением и объявлением переменной #1
Здравствуйте! При определении переменной под неё выделяется память.Скажите, выделяется ли память под переменную при объявлении без начального значения?
C++
1
int a;
Спасибо за внимание!
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.08.2014, 13:06     Разница между определением и объявлением переменной
Посмотрите здесь:

Разница между i++ и ++i.Си C++
C++ Разница между 0 и 00 ?
C++ Разница между T **a и T *a[const_size]
C++ Разница между определением переменной до и непосредственно в самой инструкции for
C++ Разница между != и <=
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
intern
 Аватар для intern
15 / 15 / 6
Регистрация: 30.03.2014
Сообщений: 67
Завершенные тесты: 1
22.08.2014, 13:21     Разница между определением и объявлением переменной #2
При объявлении память не выделятся.
А при определении без начального значения выделятся.
DieMore
3 / 3 / 2
Регистрация: 21.08.2014
Сообщений: 17
22.08.2014, 13:35  [ТС]     Разница между определением и объявлением переменной #3
intern, можно пример, где память не выделяется?
StasyanKO
9 / 9 / 0
Регистрация: 13.04.2013
Сообщений: 63
22.08.2014, 13:42     Разница между определением и объявлением переменной #4
Начёт памяти не знаю, но вот, на примере функций, объявление и определение:

C++
1
2
3
4
5
6
7
8
9
10
11
12
int func();                    //объявление
 
int main()
{
    func();
    return 0;
}
 
int func()                      //определение
{
    return 2;
}
John Prick
754 / 687 / 123
Регистрация: 27.07.2012
Сообщений: 1,974
Завершенные тесты: 3
22.08.2014, 13:43     Разница между определением и объявлением переменной #5
DieMore, для любых объектов объявление означает, что память под него выделена.

Немного особняком тут стоят указатели:
C++
1
SomeClass * pObject;
Здесь объявлен указатель на объект типа SomeClass. Хотя самого этого объекта ещё не существует, а указатель не инициализирован ничем (и соответсвенно, его нельзя пока использовать), но при этом память под сам указатель выделена.
HighPredator
 Аватар для HighPredator
5347 / 1730 / 320
Регистрация: 10.12.2010
Сообщений: 5,112
Записей в блоге: 3
22.08.2014, 14:02     Разница между определением и объявлением переменной #6
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Объявление -- это описание идентификатора и описание его типа, будь то тип, объект или функция. Проще говоря, это то, что нужно компилятору чтобы принять "ссылки" (не & такие ссылки, а в другом смысле) на этот идентификатор. Т.е. чтобы понять о чем речь. Определение же в свою очередь, это то, что нужно линкеру чтобы связать "ссылки-упоминания" идентификатора в осмысленную конструкцию.
Вот объявления:
C++
1
2
3
4
extern int a;
extern int b(int, int);
float c(char, double); // c++ позволяет опускать extern при объявлении функций
class d; // класс нельзя объявить как extern
Вот соответствующие им определения:
C++
1
2
3
4
int a;
int b(int arg1, int arg2) {return arg1 * arg2;}
float c(char arg1, double arg2){return arg2;}
class d {};
Видно, что определять можно и без объявления. При этом, объявлять можно сколько угодно раз, но определять - всего один. Касательно вашего вопроса, стандарт говорит примерно следующее:
"объявление есть определение ... если только это не объявление имени класса"
.

Добавлено через 2 минуты

Не по теме:

P.S. примеры вообще от фонаря, так что код-нацизмом прошу не заниматься

intern
 Аватар для intern
15 / 15 / 6
Регистрация: 30.03.2014
Сообщений: 67
Завершенные тесты: 1
22.08.2014, 17:21     Разница между определением и объявлением переменной #7
Определение также является и объявлением. Память же выделяется только при определении.
C++
1
2
3
int a, b=1; //объявление+определение, память выделяется
extern int c; //объявление, память не выделяется
extern int d=1; //объявление+определение, память выделяется
John Prick
754 / 687 / 123
Регистрация: 27.07.2012
Сообщений: 1,974
Завершенные тесты: 3
22.08.2014, 17:33     Разница между определением и объявлением переменной #8
Цитата Сообщение от intern Посмотреть сообщение
extern int d=1;
Подобное не компилируется.
intern
 Аватар для intern
15 / 15 / 6
Регистрация: 30.03.2014
Сообщений: 67
Завершенные тесты: 1
22.08.2014, 18:08     Разница между определением и объявлением переменной #9
Компилируется, если определять глобально (gcc 4.8.1)
Alex5
883 / 618 / 81
Регистрация: 12.04.2010
Сообщений: 1,552
23.08.2014, 14:24     Разница между определением и объявлением переменной #10
Цитата Сообщение от John Prick Посмотреть сообщение
extern int d=1;
Подобное не компилируется.
Цитата Сообщение от intern Посмотреть сообщение
Компилируется, если определять глобально (gcc 4.8.1)
Пример 1. (В примерах глобальные переменные.)
C++
1
2
3
4
5
6
7
8
9
10
// Построение: успешно: 1
 
file1.cpp        
 
extern int d;
 
 
file2.cpp
 
extern int d=2;
Пример 2.
C++
1
2
3
4
5
6
7
8
9
10
// error LNK2005: "int d" (?d@@3HA) уже определен 
 
//  file1.cpp        
 
int d;  
 
 
// file2.cpp
 
extern int d=2;

Пример 3.
C++
1
2
3
4
5
6
7
8
9
// error LNK2005: "int d3" (?d3@@3HA) уже определен 
 
file1.cpp        
 
extern int d3=1;
 
file2.cpp
 
extern int d3=2;
John Prick
754 / 687 / 123
Регистрация: 27.07.2012
Сообщений: 1,974
Завершенные тесты: 3
23.08.2014, 23:09     Разница между определением и объявлением переменной #11
Цитата Сообщение от Alex5 Посмотреть сообщение
// Построение: успешно: 1
А теперь попробуйте где-нибудь в коде использовать эту переменную.
ValeryS
Модератор
6376 / 4842 / 442
Регистрация: 14.02.2011
Сообщений: 16,045
23.08.2014, 23:16     Разница между определением и объявлением переменной #12
Цитата Сообщение от intern Посмотреть сообщение
extern int c; //объявление, память не выделяется
можно это назвать объявлением
но по большому счету это команда компилятору"не заморачивайся переменная определена в другом месте"
посему не вижу смысла в такой конструкции
Цитата Сообщение от intern Посмотреть сообщение
extern int d=1;
Alex5
883 / 618 / 81
Регистрация: 12.04.2010
Сообщений: 1,552
24.08.2014, 12:26     Разница между определением и объявлением переменной #13
Цитата Сообщение от John Prick Посмотреть сообщение
// Построение: успешно: 1
А теперь попробуйте где-нибудь в коде использовать эту переменную.
Она уже использована (инициализация). Можно добавить к примеру 1:
C++
1
2
3
4
    cout << &d;
    cout << d;
    ++d;
    cout << d;
Цитата Сообщение от ValeryS Посмотреть сообщение
посему не вижу смысла в такой конструкции
Сообщение от intern
extern int d=1;
Видимо, (для глобальной переменной) компилятор (VS) в этой строке просто игнорирует слово extern. Во всяком случае, в примерах (сообщ.10 ) результат (успешно или нет) будет тем же самым, если каждую строку вида
C++
1
extern int d=1;
заменить на
C++
1
int d=1;
Добавлено через 4 минуты
В случае локальной переменной
Цитата Сообщение от John Prick Посмотреть сообщение
Подобное не компилируется.
C++
1
2
3
4
5
int main()
{
/*  error C2205: a: невозможно инициализировать внешние переменные с областью видимости блока */
 
    extern int a = 1;
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.08.2014, 12:46     Разница между определением и объявлением переменной
Еще ссылки по теме:

C++ Разница между С и С++
C++ Загвоздка с объявлением переменной
C++ Разобраться с коротеньким объявлением переменной

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

Или воспользуйтесь поиском по форуму:
ValeryS
Модератор
6376 / 4842 / 442
Регистрация: 14.02.2011
Сообщений: 16,045
24.08.2014, 12:46     Разница между определением и объявлением переменной #14
Цитата Сообщение от Alex5 Посмотреть сообщение
В случае локальной переменной
внешняя (extern) не может быть локальной
Yandex
Объявления
24.08.2014, 12:46     Разница между определением и объявлением переменной
Ответ Создать тему
Опции темы

Текущее время: 00:13. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru