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

Классы основы - C++

Восстановить пароль Регистрация
 
downloadpascal
0 / 0 / 0
Регистрация: 15.05.2010
Сообщений: 32
12.06.2010, 01:55     Классы основы #1
class a1 // это определение класса
{
-||-||-;
};

a1 b; // как я понимаю это объявление

скажите пожалуйста где здесь объявление, а где определение класса? ато совсем запутал препод,
говорит что при объявлении класса не создается объект, как я понимаю создается объект b;
и в каком месте выделяется память(как я понимаю в самом классе)?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.06.2010, 01:55     Классы основы
Посмотрите здесь:

Классы возможностей(Mixin классы) C++
С++ основы основ C++
C++ классы/дочерние классы/методы
C++ Основы массивов
Основы ветвления C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Mur3ik
102 / 102 / 4
Регистрация: 12.05.2010
Сообщений: 232
12.06.2010, 02:05     Классы основы #2
C++
1
2
3
4
class a1 
{
-||-||-;
};
это твой класс, он память не выделяет, просто говорит из чего будет состоять объект этого класса

C++
1
2
3
4
void main
{
a1 b;
}
а вот тут уже выделяется память под объект b
][акер
#define книжный_червь Я
 Аватар для ][акер
182 / 93 / 6
Регистрация: 30.01.2010
Сообщений: 780
12.06.2010, 02:07     Классы основы #3
C++
1
2
3
4
5
6
class a1 // Это определение класса
{
-||-||-;
};
 
a1 b; // Это объявление
Цитата Сообщение от downloadpascal Посмотреть сообщение
и в каком месте выделяется память
При описании объекта.
Цитата Сообщение от downloadpascal Посмотреть сообщение
говорит что при объявлении класса не создается объект, как я понимаю создается объект b;
при описании класса ничего не выделяется (и не должно). Его определяют чтобы компилятор знал какие там данные и функции.
Андрейка
410 / 214 / 24
Регистрация: 25.03.2009
Сообщений: 717
12.06.2010, 15:59     Классы основы #4
downloadpascal,
class a; - объявление
class a
{
}; - определение

int main()
{
a obj; - создание объекта в стеке, вызов конструктор по умолчанию.
Mr.X
Эксперт С++
 Аватар для Mr.X
2807 / 1583 / 248
Регистрация: 03.05.2010
Сообщений: 3,698
12.06.2010, 19:59     Классы основы #5
Во-первых, термины «объявление» и «определение» относятся к какому-либо имени, примененному в программе, а не к некоему «классу».
Т.е.
C++
1
2
3
4
class a1 
{
//…
};
это определение имени a1, сообщающее, что оно является именем класса (т.е. типа) и описывающее этот класс, а
C++
1
a1 b;
это определение имени b, сообщающее, что оно является именем объекта (т.е. переменной) класса (т.е. типа) a1 и присвоение ему значения класса a1 по умолчанию.
Во-вторых, выделение памяти зависит не от того, объявлен, либо определен некий идентификатор.
Память выделяется только при определении объектов (т.е. переменных), так как, согласно стандарту, объект – это и есть область памяти, имеющая тип, значение, и, возможно, имя.
При определении типов (в том числе классов) память не выделяется.
Skoi
16 / 16 / 1
Регистрация: 31.07.2009
Сообщений: 54
12.06.2010, 20:53     Классы основы #6
Цитата Сообщение от Mr.X Посмотреть сообщение
Память выделяется только при определении объектов (т.е. переменных), так как, согласно стандарту, объект – это и есть область памяти, имеющая тип, значение, и, возможно, имя.
При определении типов (в том числе классов) память не выделяется.
Память выделяется оператором new - где его нет, там ничего не выделяется.
Когда вы объявляете int i; - никакая память не выделяется, переменная в стеке(как Вам верно указали).

Добавлено через 46 секунд
А когда пишете int* i = new int; - вот тут память выделяется.
Mr.X
Эксперт С++
 Аватар для Mr.X
2807 / 1583 / 248
Регистрация: 03.05.2010
Сообщений: 3,698
12.06.2010, 23:52     Классы основы #7
Цитата Сообщение от Skoi Посмотреть сообщение
Память выделяется оператором new - где его нет, там ничего не выделяется.
Когда вы объявляете int i; - никакая память не выделяется, переменная в стеке(как Вам верно указали).

Добавлено через 46 секунд
А когда пишете int* i = new int; - вот тут память выделяется.
Стек это область памяти. А вы под этим что-то другое подразумеваете?
Skoi
16 / 16 / 1
Регистрация: 31.07.2009
Сообщений: 54
13.06.2010, 03:06     Классы основы #8
Цитата Сообщение от Mr.X Посмотреть сообщение
Стек это область памяти. А вы под этим что-то другое подразумеваете?
Нет. Ничего другого я под этим не подразумеваю ) Я просто говорю о том, что эта память не выделяется -
она ужа выделена ОС равно как и под ваш код. Вы же не говорите что printf("Hello world"); выделяет вам память под строчку "Hello world"... Вот тут тож самое.

Добавлено через 26 минут
Ну т.е. стек - это неотъемлемая часть программы, без которой программа
существовать не сможет... Ну сможет, но не долго - до первых инструкций
типа push или call. А дальше упадёт... ну или даже уронит окружение, если
оно кривое.

Поэтому стек объявляют заранее, если он нужен большой - а то потом навешаете
туды жирных классов и будете ловить stack overflow.

А так стек- только для хранения указателей на выделенную память и мелкие
типы типа int хранить.
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
13.06.2010, 06:43     Классы основы #9
Цитата Сообщение от Skoi Посмотреть сообщение
Вы же не говорите что printf("Hello world"); выделяет вам память под строчку "Hello world"...
Ну вообще-то так и есть... Опять же в стеке резервируется 12 байт на строку и завершающий ноль и адрес первого байта этой зарезервированной памяти в качестве параметра в printf() передаётся...
Mr.X
Эксперт С++
 Аватар для Mr.X
2807 / 1583 / 248
Регистрация: 03.05.2010
Сообщений: 3,698
13.06.2010, 11:34     Классы основы #10
Цитата Сообщение от Skoi Посмотреть сообщение
Когда вы объявляете int i; - никакая память не выделяется, переменная в стеке
Ну, чувствуется, что этот раздел учебника вы еще не открывали.
При выполнении программой строки
C++
1
int i;
создается объект i (т.е. выделяется память) либо в статической памяти, если это статическая переменная, (и хранится до завершения программы), либо в автоматической памяти (стеке) (и хранится до выхода из блока).

Вы удивитесь, но при выполнении программой, например, строки
C++
1
x * y + z;
в памяти создается временный объект с результатом вычисления выражения x * y, который уничтожается по достижении конца выражения.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.06.2010, 00:39     Классы основы
Еще ссылки по теме:

Классы и основы наследования, с++ C++
Классы, включающие другие классы C++
C++ Основы ООП

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

Или воспользуйтесь поиском по форуму:
Skoi
16 / 16 / 1
Регистрация: 31.07.2009
Сообщений: 54
17.06.2010, 00:39     Классы основы #11
Ребят, что Вы меня путаете?

Вот "выделяю память через int i;" и упираюсь в заранее отведенный стек в доли секунды -
Классы основы
Т.е. ничего там не выделяется, по заполнению заранее определенного стека приложение падает.

Вот тут выделяю память как положено -
Классы основы
Так сразу видно и как пямять выделяется, и ждать устал пока ... так и не рухнуло приложение.

Яж не сам придумал, а Вы сразу в учебник тыкать.

Добавлено через 7 минут
Цитата Сообщение от easybudda Посмотреть сообщение
Ну вообще-то так и есть... Опять же в стеке резервируется 12 байт на строку и завершающий ноль и адрес первого байта этой зарезервированной памяти в качестве параметра в printf() передаётся...
А енто, имхо, может быть вообще платформозависимо.

Assembler
1
2
3
4
5
                          nop
                          jmp next
KData                  db 'Hello, world',0
next:                   push offset Kdata
                          call DisplayFuckingString
И где что тут выделяется?
Yandex
Объявления
17.06.2010, 00:39     Классы основы
Ответ Создать тему
Опции темы

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