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

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

Войти
Регистрация
Восстановить пароль
 
Сонца
23 / 23 / 6
Регистрация: 20.06.2013
Сообщений: 83
#1

Конструктор по умолчанию - C++

05.11.2013, 02:32. Просмотров 419. Ответов 12
Метки нет (Все метки)

Я то ли динамику недопоняла, то ли классы, то ли конструктор... И теперь совсем запуталась.

Что нужно написать в конструкторе без параметров, что бы можно было создавать объекты класса просто
C++
1
 Student stud;
а, не
C++
1
Student stud ("a", "b", 1, "c");
учитывая, что методы SetName и SetGroup выделяют динамическую память для поля по размеру передаваемого параметра перед записью в них. Теоретически я понимаю, что можно выделять некоторое число памяти и вписывать туда "что-то" в пределах выделенной памяти, но будет ли это правильным подходом если нужен "пустой" объект?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
class Student
{
    char * firstName;
    char * lastName;
    short age;
    char * group;
 
public:
    Student (char * f_n, char * l_n, short _a, char * g_str) 
    {
        firstName = new char [strlen(f_n) + 1]; strcpy_s (firstName, strlen(f_n) + 1, f_n);
        lastName = new char [strlen(l_n) + 1]; strcpy_s (lastName, strlen(l_n) + 1, l_n);
        age = _a;
        group = new char [strlen(g_str) + 1]; strcpy_s (group, strlen(g_str) + 1, g_str);
    }
    ~Student () 
    { delete []firstName; delete []lastName; delete []group;}
 
    void Info();
    void SetName (char * fname, char * lname);
    void SetGroup (char * gname);
    void SetAge (short a);
    short GetAge();
    char * GetName ();
};
p.s. может выражаю свой вопрос не корректно, заранее прошу извинить.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.11.2013, 02:32     Конструктор по умолчанию
Посмотрите здесь:

Конструктор по умолчанию - C++
Здраститя. #include <iostream> using namespace std; class random { public: random(int b){a=b;} ~random(){} int...

Конструктор по умолчанию - C++
Всем привет! Если в классе вообще нет конструктора, чем будут инициализироваться члены класса? И в чем отличие объект() и объект...

Конструктор по умолчанию - C++
У меня получается создавать конструктор по умолчанию если в хедере эти значения указаны: class Unit { protected: string name; ...

Конструктор по умолчанию - C++
Здравствуйте, есть такой код: explicit RFileDownloader(QObject *parent = 0); explicit RFileDownloader(const QUrl &url = QUrl(),...

Конструктор по умолчанию - C++
Доброе утро! При попытке доступа к данным-элементам объекта, созданного конструктором по умолчанию, программа загибается. Возникло...

Конструктор по умолчанию - C++
как использовать конструктор по умолчанию в конструкторе с параметром? К по умолчанию заполняет массив заранее определёнными символами, а...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Croessmah
Модератор
Эксперт CЭксперт С++
13045 / 7308 / 814
Регистрация: 27.09.2012
Сообщений: 18,041
Записей в блоге: 3
Завершенные тесты: 1
05.11.2013, 02:34     Конструктор по умолчанию #2
Можете присвоить указателям нулевое значение.

P.S. Еще оператор присваивания и конструктор копий надо сделать для этого класса
ValeryS
Модератор
6550 / 5016 / 463
Регистрация: 14.02.2011
Сообщений: 16,728
05.11.2013, 02:39     Конструктор по умолчанию #3
Цитата Сообщение от Сонца Посмотреть сообщение
Теоретически я понимаю, что можно выделять некоторое число памяти и вписывать туда "что-то" в пределах выделенной памяти, но будет ли это правильным подходом если нужен "пустой" объект?
нет
правильно будет так
C++
1
2
3
4
5
6
7
 Student () 
{
  firstName = NULL;
  lastName = NULL;
  age =0
  group = NULL;
 }
Добавлено через 1 минуту
да и вот это обязательно
Цитата Сообщение от Croessmah Посмотреть сообщение
Еще оператор присваивания и конструктор копий надо сделать для этого класса
Сонца
23 / 23 / 6
Регистрация: 20.06.2013
Сообщений: 83
05.11.2013, 03:07  [ТС]     Конструктор по умолчанию #4
Croessmah, ValeryS, благодарю. Но попутно вопрос, нужно (и если да, то как) проверять или отслеживать попытки использовать объект без "информационной" инициализации, а только с NULL?


Это можно считать оператором присваивания или речь о чем-то другом? Про конструктор копирования еще пока ничего не знаю, увы.
C++
1
2
3
4
5
6
7
8
9
10
    void operator = (Student & st2)
    {
        firstName = new char [strlen (st2.firstName) + 1];
        strcpy_s (firstName, strlen (st2.firstName) + 1, st2.firstName);
        lastName = new char[strlen (st2.lastName) + 1];
        strcpy_s (lastName, strlen (st2.lastName) + 1, st2.lastName);
        age = st2.age;
        group = new char[strlen (st2.group) + 1];
        strcpy_s (group, strlen (st2.group) + 1, st2.group);
    }
И вопрос. Если метод SetName выглядит так, то нужно ли мне проверять является ли поле NULL указателем и если в нем уже что-то есть - предварительно освобождать уже занятую память?
C++
1
2
3
4
5
6
7
void Student::SetName (char * fName, char * lName)
{
    firstName = new char [strlen (fName) + 1];
    lastName = new char [strlen (lName) + 1];
    strcpy_s (firstName, strlen (fName) + 1,  fName);
    strcpy_s (lastName, strlen (lName) + 1, lName);
}
Croessmah
Модератор
Эксперт CЭксперт С++
13045 / 7308 / 814
Регистрация: 27.09.2012
Сообщений: 18,041
Записей в блоге: 3
Завершенные тесты: 1
05.11.2013, 03:15     Конструктор по умолчанию #5
Цитата Сообщение от Сонца Посмотреть сообщение
Если метод SetName выглядит так, то нужно ли мне проверять является ли поле NULL указателем и если в нем уже что-то есть - предварительно освобождать уже занятую память?
Точно.
Код
Если указатель не равен нулю {
   освобождаем уже выделенную память.
}
выделяем память, заполняем чем нужно
Добавлено через 4 минуты
Цитата Сообщение от Сонца Посмотреть сообщение
Про конструктор копирования еще пока ничего не знаю, увы.
Ну значит скоро уже узнаете
Цитата Сообщение от Сонца Посмотреть сообщение
Но попутно вопрос, нужно (и если да, то как) проверять или отслеживать попытки использовать объект без "информационной" инициализации, а только с NULL?
Если указатель равен нулю, то принимать какие-то меры (какие именно - решать Вам)
Сонца
23 / 23 / 6
Регистрация: 20.06.2013
Сообщений: 83
05.11.2013, 03:18  [ТС]     Конструктор по умолчанию #6
Цитата Сообщение от Croessmah Посмотреть сообщение
Ну значит скоро уже узнаете
Очень много информации Сама стараюсь читать, пробовать, и хорошо что, есть отзывчивые люди, которые не проходят мимо Мне еще нужно прикрутить методы с файлами и если все пройдет благополучно, то прямо сегодня и узнаю
Еще раз благодарю за помощь.
ValeryS
Модератор
6550 / 5016 / 463
Регистрация: 14.02.2011
Сообщений: 16,728
05.11.2013, 03:24     Конструктор по умолчанию #7
Цитата Сообщение от Сонца Посмотреть сообщение
Про конструктор копирования еще пока ничего не знаю, увы.
читай
http://ru.wikipedia.org/wiki/Конструктор_копирования
вот еще рекомендую
http://www.e-reading.biz/book.php?book=1002058
MrGluck
Модератор
Эксперт CЭксперт С++
7158 / 4324 / 630
Регистрация: 29.11.2010
Сообщений: 11,745
05.11.2013, 04:13     Конструктор по умолчанию #8
А также if-ы в деструкторе, иначе еррор при попытке удалить объект, созданный конструктором по умолчанию.

Советую использовать std::string если задание не предполагает обучение навыкам работы с динамической памятью.
ct0r
Игогошка!
1768 / 670 / 42
Регистрация: 19.08.2012
Сообщений: 1,284
Завершенные тесты: 1
05.11.2013, 04:21     Конструктор по умолчанию #9
Цитата Сообщение от MrGluck Посмотреть сообщение
А также if-ы в деструкторе, иначе еррор при попытке удалить объект, созданный конструктором по умолчанию.
Зачем ифы? Какой еррор?
MrGluck
Модератор
Эксперт CЭксперт С++
7158 / 4324 / 630
Регистрация: 29.11.2010
Сообщений: 11,745
05.11.2013, 04:55     Конструктор по умолчанию #10
Цитата Сообщение от ct0r Посмотреть сообщение
Зачем ифы? Какой еррор?
Это я загнался по поводу удаления NULL, но сейчас глянул в стандарт - там delete и delete[] обязуют проверять на NULL перед освобождением памяти, так что все в порядке.

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

Не по теме:

Видимо пора спать

Сонца
23 / 23 / 6
Регистрация: 20.06.2013
Сообщений: 83
05.11.2013, 11:19  [ТС]     Конструктор по умолчанию #11
Цитата Сообщение от MrGluck Посмотреть сообщение
Советую использовать std::string если задание не предполагает обучение навыкам работы с динамической памятью.
Задание требует, чтобы поля класса были динамическими. Не смотря на то, что вчера было первое занятие в стиле "ввод в ооп, класс это ...". Что-то читаю сама. Задача научится и разобраться, хотя и получается немного сумбурно, поскольку нужно все и сразу.

Цитата Сообщение от MrGluck Посмотреть сообщение
но сейчас глянул в стандарт - там delete и delete[] обязуют проверять на NULL перед освобождением памяти, так что все в порядке.
C++
1
2
3
4
5
6
7
8
9
        ~Student () 
        { 
            if (firstName != nullptr)
                delete []firstName; 
            if (lastName != nullptr)
                delete []lastName;
            if (group != nullptr)
                delete []group;
        }
Так? Или как-то иначе?
Croessmah
Модератор
Эксперт CЭксперт С++
13045 / 7308 / 814
Регистрация: 27.09.2012
Сообщений: 18,041
Записей в блоге: 3
Завершенные тесты: 1
05.11.2013, 11:22     Конструктор по умолчанию #12
Цитата Сообщение от Сонца Посмотреть сообщение
Так? Или как-то иначе?
Так. Но если условия убрать, то ошибок не будет )
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.11.2013, 11:23     Конструктор по умолчанию
Еще ссылки по теме:

Конструктор по умолчанию - C++
Показывает ошибку : 1 IntelliSense: для класса "tovar" не существует конструктор по умолчанию Подскажите пожалуйста как сделать ...

Конструктор с параметрами по умолчанию - C++
пытаюсь создать класс с параметрами по умолчанию(я да, надеюсь, что я не путаюсь в терминах) #include <iostream> class some { ...

Конструктор копий по умолчанию. - C++
Почему, когда в vc++ vdfsadsad Добавлено через 46 секунд Почему если идёшь по коду с заходом в функцию не отображается вызов...

Конструктор с параметром по умолчанию - C++
Здравствуйте, знаю, что здесь про конструкторы много говорили, но я не смог решить свою проблему поэтому обращаюсь (хотя мне кажется что...


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

Или воспользуйтесь поиском по форуму:
ValeryS
Модератор
6550 / 5016 / 463
Регистрация: 14.02.2011
Сообщений: 16,728
05.11.2013, 11:23     Конструктор по умолчанию #13
Цитата Сообщение от Сонца Посмотреть сообщение
Так? Или как-то иначе?
как было в начале
delete NULL ни к чему страшному не приведет, просто не выполнится
следовательно смысла в этой проверке нет
Yandex
Объявления
05.11.2013, 11:23     Конструктор по умолчанию
Ответ Создать тему
Опции темы

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