Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
131 / 108 / 12
Регистрация: 04.12.2010
Сообщений: 313
1

Конструктор и деструктор в классе

23.07.2012, 11:26. Просмотров 1173. Ответов 13
Метки нет (Все метки)

Решил разобраться в конструкторах и деструкторах. Написал, вроде по такой же структуре как и в учебнике. А комп выдает ошибки в компиляции, связанные с типом главной функции.
Что не так, подскажите...

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
26
27
28
29
30
31
32
#include <iostream>
#include <cstring>
using namespace std;
 
class String
{
    private:
        char *str;
    public:
        String (char *s) // конструктор
        {
            int length = strlen (s);
            str = new char [length + 1];
            strcpy ( str, s);
        }
        ~String () // деструктор
        {
            cout<< "Delete string\n";
            delete [] str;
        }
        void display ()
        {
            cout<< str<< endl;
        }
}
 
int main() // насчет этой строки все ошибки
{
    String mas = "This is a new mass of words";
    cout << "mas = "; mas.display();
    return 0;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.07.2012, 11:26
Ответы с готовыми решениями:

Конструктор инициализации, конструктор копирования, деструктор
Я сделал почти задание по перегрузке операторов. Осталось одно, тоесть три: конструктор...

Создать класс "Вектор" и реализовать конструктор по умолчанию, конструктор копирования и деструктор
Всем доброго времени суток! нужна ваша помощь! нужно создать класс вектор и реализовать...

Конструктор и деструктор в С++
Никак не могу найти ошибку. Выдает несоответствие результата и функции /gkh.cpp/ #include...

Конструктор/деструктор
Подскажите пожалуйста как внедрить в вот эту программу конструктор и деструктор... В программе...

13
137 / 126 / 14
Регистрация: 03.07.2012
Сообщений: 355
23.07.2012, 11:29 2
После класса поставь точку с запятой
C++
1
2
3
4
class String
{
...
};
1
Эксперт С++
2919 / 1268 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
23.07.2012, 11:31 3
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
26
27
28
29
30
31
32
#include <iostream>
#include <cstring>
using namespace std;
 
class String
{
    private:
        char *str;
    public:
        String (const char *s)  // <--- вот тут const
        {
            int length = strlen (s);
            str = new char [length + 1];
            strcpy ( str, s);
        }
        ~String ()
        {
            cout<< "Delete string\n";
            delete [] str;
        }
        void display ()
        {
            cout<< str<< endl;
        }
};  // <--- вот тут ;
 
int main()
{
    String mas = "This is a new mass of words";
    cout << "mas = "; mas.display();
    return 0;
}
А теперь сделай следующий шаг: разработай правильный конструктор копирования и оператор =.
1
Фрилансер
Эксперт С++
5842 / 1223 / 499
Регистрация: 23.11.2010
Сообщений: 3,377
Записей в блоге: 1
23.07.2012, 11:32 4
Цитата Сообщение от Алексaндр Посмотреть сообщение
}

int main()
C++
1
2
3
};
 
int main()
1
131 / 108 / 12
Регистрация: 04.12.2010
Сообщений: 313
23.07.2012, 11:37  [ТС] 5
Да... Точно... В книге её нет (

Добавлено через 4 минуты
CheshireCat, всмысле "правильный конструктор копирования" ? Ты про ссылку на константу ?
0
Фрилансер
Эксперт С++
5842 / 1223 / 499
Регистрация: 23.11.2010
Сообщений: 3,377
Записей в блоге: 1
23.07.2012, 11:41 6
Алексaндр, если самому не сделать конструктор копирования, будет работать конструктор копирования по умолчанию. В данном случае он совершенно не подходит, т.к. использует побитовое копирование данных. После копирования данных через default copy конструктор, строка другого объекта данного класса будет ссылаться на ту же область памяти, что и строка первого объекта. В результате освобождения памяти произойдет утечка.

C++
1
2
3
4
5
String(const String &obj)
{
    str = new char [strlen(obj.str) + 1];
    strcpy(str, obj.str);
}
1
131 / 108 / 12
Регистрация: 04.12.2010
Сообщений: 313
23.07.2012, 12:26  [ТС] 7
Dekio, тогда ошибку выбивает "conversion from `const char[28]' to non-scalar type `String' requested"

Не может char в String вбить ?
0
Фрилансер
Эксперт С++
5842 / 1223 / 499
Регистрация: 23.11.2010
Сообщений: 3,377
Записей в блоге: 1
23.07.2012, 12:31 8
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#include <iostream>
#include <cstring>
using namespace std;
 
class String
{
    private:
        char *str;
    public:
        String (const char *s)
        {
            int length = strlen (s);
            str = new char [length + 1];
            strcpy ( str, s);
        }
        String(const String &obj)
        {
            str = new char [strlen(obj.str) + 1];
            strcpy(str, obj.str);
        }
        ~String ()
        {
            cout<< "Delete string\n";
            delete [] str;
        }
        void display ()
        {
            cout<<str<<endl;
        }
        //допишем функцию для вывода адреса строки
        void showAdr()
        {
           cout<<&str<<endl;
        }
}; 
 
int main()
{
    String mas = "This is a new mass of words";
    cout << "mas = "; mas.display();
    String newStr = mas;
    mas.showAdr();
    newStr.showAdr();
    return 0;
}
http://liveworkspace.org/code/... 8a035efd5e
1
187 / 180 / 25
Регистрация: 27.01.2012
Сообщений: 1,335
23.07.2012, 13:32 9
Насколько мне известно, это потому, что :
C++
1
2
3
4
5
6
7
8
9
10
11
String (const char *s)
        {
            int length = strlen (s);
            str = new char [length + 1];
            strcpy ( str, s);
        }
        String(const String &obj)
        {
            str = new char [strlen(obj.str) + 1];
            strcpy(str, obj.str);
        }
Данная конструкция приводит твою строку "..." к типу String, а затем передает уже ссылку на неё в конструктор копирования (здесь оно второй по счету)
1
Jupiter
23.07.2012, 13:37
  #10

Не по теме:

Цитата Сообщение от nexen Посмотреть сообщение
int length = strlen (s);
Алексaндр, nexen, strlen возвращает не int и не стоит этим пренебрегать!

0
131 / 108 / 12
Регистрация: 04.12.2010
Сообщений: 313
23.07.2012, 15:34  [ТС] 11
Jupiter, не int ??? Мы в лицее всегда в int её вбивали. А чтo она возвращает ?
0
Jupiter
23.07.2012, 15:37
  #12

Не по теме:

Цитата Сообщение от Алексaндр Посмотреть сообщение
А чт она возвращает ?
это не ко мне, это к документации


0
187 / 180 / 25
Регистрация: 27.01.2012
Сообщений: 1,335
23.07.2012, 16:31 13
Цитата Сообщение от Jupiter Посмотреть сообщение

Не по теме:


это не ко мне, это к документации

Не по теме:

Какой сайт более информативный? cplusplus или cppreference? Сам пользуюсь первым, но, как мне сказали, на втором информация "по-слаще"

0
Dekio
23.07.2012, 16:34     Конструктор и деструктор в классе
  #14

Не по теме:

nexen, глупый вопрос. Какая разница какой сайт? Информация почти одинакова. Если есть конкретный вопрос, вбиваем в любой из них (хоть в 2 сразу) и смотрим

0
23.07.2012, 16:34
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.07.2012, 16:34
Привет! Вот еще темы с ответами:

Конструктор, деструктор
Дорогие друзья, программисты. Помогите пожалуйста разобраться с конструктором и деструктором, а так...

конструктор и деструктор
помоги пожалуйста написать программу в которой создаются и разрушаются объекты определенного...

С++. Конструктор, деструктор
Ребята!!! Помогите пожалуйста, не знаю как сделать это задание на С++. Нужно разработать класс...

Конструктор и деструктор
Всем привет! В программе не работает конструктор с параметрами! Можете подсказать чего я не так...


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

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

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