Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
DieMore
3 / 3 / 2
Регистрация: 21.08.2014
Сообщений: 17
#1

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

22.08.2014, 13:06. Просмотров 1561. Ответов 13
Метки нет (Все метки)

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

В чем разница между объявлением переменной до и в цикле?
Как лучше? int main() { for (int i = 0; i < 10; i++) { int n = 3; ...

Разница между определением переменной до и непосредственно в самой инструкции for
Если провести инициализацию переменной до инструкции for, программа работает...

Загвоздка с объявлением переменной
Всем доброго времени суток. Недавно начал изучать С++ по Дейтелу. Есть такой...

Разобраться с коротеньким объявлением переменной
Драсьте, возник небольшой вопрос по теории, дано вот такое объявление, а вместе...

Объясните разницу между прототипом и определением функции
Объясните разницу между прототипом и определением функции.

Разница начального и конечного значений переменной
Подскажите пожалуйста возможно ли решить такую проблему, имеется переменная...

13
intern
15 / 15 / 8
Регистрация: 30.03.2014
Сообщений: 74
Завершенные тесты: 2
22.08.2014, 13:21 #2
При объявлении память не выделятся.
А при определении без начального значения выделятся.
0
DieMore
3 / 3 / 2
Регистрация: 21.08.2014
Сообщений: 17
22.08.2014, 13:35  [ТС] #3
intern, можно пример, где память не выделяется?
0
StasyanKO
9 / 9 / 1
Регистрация: 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;
}
0
John Prick
831 / 764 / 256
Регистрация: 27.07.2012
Сообщений: 2,176
Завершенные тесты: 3
22.08.2014, 13:43 #5
DieMore, для любых объектов объявление означает, что память под него выделена.

Немного особняком тут стоят указатели:
C++
1
SomeClass * pObject;
Здесь объявлен указатель на объект типа SomeClass. Хотя самого этого объекта ещё не существует, а указатель не инициализирован ничем (и соответсвенно, его нельзя пока использовать), но при этом память под сам указатель выделена.
1
HighPredator
5647 / 1964 / 716
Регистрация: 10.12.2010
Сообщений: 5,691
Записей в блоге: 3
22.08.2014, 14:02 #6
Лучший ответ Сообщение было отмечено Jupiter как решение

Решение

Объявление -- это описание идентификатора и описание его типа, будь то тип, объект или функция. Проще говоря, это то, что нужно компилятору чтобы принять "ссылки" (не & такие ссылки, а в другом смысле) на этот идентификатор. Т.е. чтобы понять о чем речь. Определение же в свою очередь, это то, что нужно линкеру чтобы связать "ссылки-упоминания" идентификатора в осмысленную конструкцию.
Вот объявления:
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. примеры вообще от фонаря, так что код-нацизмом прошу не заниматься

1
intern
15 / 15 / 8
Регистрация: 30.03.2014
Сообщений: 74
Завершенные тесты: 2
22.08.2014, 17:21 #7
Определение также является и объявлением. Память же выделяется только при определении.
C++
1
2
3
int a, b=1; //объявление+определение, память выделяется
extern int c; //объявление, память не выделяется
extern int d=1; //объявление+определение, память выделяется
1
John Prick
831 / 764 / 256
Регистрация: 27.07.2012
Сообщений: 2,176
Завершенные тесты: 3
22.08.2014, 17:33 #8
Цитата Сообщение от intern Посмотреть сообщение
extern int d=1;
Подобное не компилируется.
0
intern
15 / 15 / 8
Регистрация: 30.03.2014
Сообщений: 74
Завершенные тесты: 2
22.08.2014, 18:08 #9
Компилируется, если определять глобально (gcc 4.8.1)
0
Alex5
1120 / 781 / 231
Регистрация: 12.04.2010
Сообщений: 2,007
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;
0
John Prick
831 / 764 / 256
Регистрация: 27.07.2012
Сообщений: 2,176
Завершенные тесты: 3
23.08.2014, 23:09 #11
Цитата Сообщение от Alex5 Посмотреть сообщение
// Построение: успешно: 1
А теперь попробуйте где-нибудь в коде использовать эту переменную.
0
ValeryS
Модератор
7133 / 5401 / 669
Регистрация: 14.02.2011
Сообщений: 18,223
23.08.2014, 23:16 #12
Цитата Сообщение от intern Посмотреть сообщение
extern int c; //объявление, память не выделяется
можно это назвать объявлением
но по большому счету это команда компилятору"не заморачивайся переменная определена в другом месте"
посему не вижу смысла в такой конструкции
Цитата Сообщение от intern Посмотреть сообщение
extern int d=1;
0
Alex5
1120 / 781 / 231
Регистрация: 12.04.2010
Сообщений: 2,007
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;
0
ValeryS
Модератор
7133 / 5401 / 669
Регистрация: 14.02.2011
Сообщений: 18,223
24.08.2014, 12:46 #14
Цитата Сообщение от Alex5 Посмотреть сообщение
В случае локальной переменной
внешняя (extern) не может быть локальной
0
24.08.2014, 12:46
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.08.2014, 12:46
Привет! Вот еще темы с решениями:

Разница между --f и f--
Не понимаю, читал, что разницы между --f и f-- вообще никакой нет, но при...

Разница между 0 и 00 ?
Как заставить программу различать 0 и 00 (ноль и два ноля, как в рулетке)?...

Разница между С и С++
Если не брать во внимание объекты и классы, то разница состоит только лишь в...

Разница между if else и else if
Привет, у меня возник &quot;нубский&quot; вопрос. Этот код, это же соркащенная версия...


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

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

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