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

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

Войти
Регистрация
Восстановить пароль
 
DieMore
3 / 3 / 2
Регистрация: 21.08.2014
Сообщений: 17
#1

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

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

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

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

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

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

Разобраться с коротеньким объявлением переменной - C++
Драсьте, возник небольшой вопрос по теории, дано вот такое объявление, а вместе с этим и определение: static const short* const x; ...

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

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

13
intern
15 / 15 / 6
Регистрация: 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 / 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;
}
0
John Prick
805 / 738 / 146
Регистрация: 27.07.2012
Сообщений: 2,110
Завершенные тесты: 3
22.08.2014, 13:43 #5
DieMore, для любых объектов объявление означает, что память под него выделена.

Немного особняком тут стоят указатели:
C++
1
SomeClass * pObject;
Здесь объявлен указатель на объект типа SomeClass. Хотя самого этого объекта ещё не существует, а указатель не инициализирован ничем (и соответсвенно, его нельзя пока использовать), но при этом память под сам указатель выделена.
1
HighPredator
5544 / 1857 / 346
Регистрация: 10.12.2010
Сообщений: 5,479
Записей в блоге: 2
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. примеры вообще от фонаря, так что код-нацизмом прошу не заниматься

1
intern
15 / 15 / 6
Регистрация: 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
805 / 738 / 146
Регистрация: 27.07.2012
Сообщений: 2,110
Завершенные тесты: 3
22.08.2014, 17:33 #8
Цитата Сообщение от intern Посмотреть сообщение
extern int d=1;
Подобное не компилируется.
0
intern
15 / 15 / 6
Регистрация: 30.03.2014
Сообщений: 74
Завершенные тесты: 2
22.08.2014, 18:08 #9
Компилируется, если определять глобально (gcc 4.8.1)
0
Alex5
1086 / 747 / 116
Регистрация: 12.04.2010
Сообщений: 1,908
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
805 / 738 / 146
Регистрация: 27.07.2012
Сообщений: 2,110
Завершенные тесты: 3
23.08.2014, 23:09 #11
Цитата Сообщение от Alex5 Посмотреть сообщение
// Построение: успешно: 1
А теперь попробуйте где-нибудь в коде использовать эту переменную.
0
ValeryS
Модератор
6709 / 5118 / 482
Регистрация: 14.02.2011
Сообщений: 17,213
23.08.2014, 23:16 #12
Цитата Сообщение от intern Посмотреть сообщение
extern int c; //объявление, память не выделяется
можно это назвать объявлением
но по большому счету это команда компилятору"не заморачивайся переменная определена в другом месте"
посему не вижу смысла в такой конструкции
Цитата Сообщение от intern Посмотреть сообщение
extern int d=1;
0
Alex5
1086 / 747 / 116
Регистрация: 12.04.2010
Сообщений: 1,908
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
Модератор
6709 / 5118 / 482
Регистрация: 14.02.2011
Сообщений: 17,213
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
Привет! Вот еще темы с ответами:

Разница между С и С++ - C++
Если не брать во внимание объекты и классы, то разница состоит только лишь в cin, cout и директивах?

Разница между != и <= - C++
Здравствуйте! Писал программу с использованием QuickSort и заинтересовала такая вещь: void quickSort(int arr, int left, int right) { ...

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

Разница между if else и else if - C++
Привет, у меня возник &quot;нубский&quot; вопрос. Этот код, это же соркащенная версия нижнего? int i = 3; if (i == 1) ...


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

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

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