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

Класс со значением полей "по умолчанию" - C++

Восстановить пароль Регистрация
 
 
Адренс Аксидор
5 / 5 / 1
Регистрация: 16.05.2012
Сообщений: 92
11.11.2013, 10:35     Класс со значением полей "по умолчанию" #1
Здравствуйте. Написал программу, но не могу сделать так, чтобы класс принимал значение полей по умолчанию - закомментированный вариант вызывает ошибку. Пожалуйста помогите исправить. И, если не сложно, объясните разницу между test,test2 и test3, а то в первом 2 вызова деструктора, во втором - один, а в третьем случае деструктор не вызывается


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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
#include <iostream>
using namespace std;
//Класс Студент
class TStudent
{
private:
    char *LastName; 
    char *FirstName; 
    char *Patronimyc;
    int Born;
    char *Group; 
 
public:
    TStudent();//char *LastName, char *FirstName, char *Patronimyc, char *Group, int Born); //Конструктор класса по умолчанию *просто выделим память под все поля
    
    ~TStudent(); //Деструтор класса
    TStudent (TStudent& Student); //Конструктор копирования по умолчанию
    TStudent operator= (TStudent& Student); //Оператор присвоения
    TStudent test(TStudent s);
    void SetLastName (char* sLastName);  //Присваивание Фамилии
    void SetFirstName (char* sFirstName);//Присваивание Имени
    void SetPatronimyc (char* sPatronimyc);//Приваивание отчества
    void SetGroup(char* sGroup);
 
    char* GetLastName(void); //Получение указателя на Фамилию
    char* GetFirstName(void);//Получение указателя на имя
    char* GetPatronimyc(void); //Получение указателя на Отчество
    int& BornDate(void); //Изменение даты рождения
    char* GetGroup(void);
    //Дружественная функция перезагрузки вывода в стандартный поток вывода (STDOUT)
    friend ostream& operator<< (ostream& out, TStudent Student)
    {
        out<<"Фамилия : "<< Student.LastName<< endl;
        out<<"Имя : "<< Student.FirstName<< endl;
        out<<"Отчество : "<< Student.Patronimyc<< endl;
         out<<"Группа : "<< Student.Group<< endl;
        out<<"Год рождения : "<< Student.Born<< endl<< endl;
        
        return out;
    }
 
};
//Конструктор по умолчанию *просто выделим память под все поля
TStudent::TStudent()//char *LastName, char *FirstName, char *Patronimyc, char *Group, int Born)
{     cout << "Вызов конструктора" << endl;
    //Выделим памяти для Фамилии, Имени и Отчества на которые указывают их указатели char*
    LastName = new char[];
       FirstName = new char[];
        Patronimyc = new char[];
     Group = new char[];
   };
//Конструктор копирования по-умолчанию
TStudent::TStudent (TStudent& Student)
{
    //В конструкторе копирования, так же выделим память на которые указывают указатели
    LastName = new char[]; 
    FirstName = new char[];
    Patronimyc = new char[];
     Group = new char[];
   
    //И скопируем в них значения из объекта класса на базе которого мы создаем объект путем копирования
   LastName=strdup(Student.LastName);
   FirstName =strdup(Student.FirstName);
    Patronimyc =strdup(Student.Patronimyc);
     Group = strdup(Student.Group);
     Born = Student.Born;
}
//Перезагрузка оператора присвоения 
TStudent TStudent::operator= (TStudent& Student) //Оператор присвоения
{
     LastName=strdup(Student.LastName);
   FirstName =strdup(Student.FirstName);
    Patronimyc =strdup(Student.Patronimyc);
     Group = strdup(Student.Group);
     Born = Student.Born;
    return *this;
}
 
//Присваивание Фамилии
void TStudent::SetLastName (char* sLastName)
{
    strcpy(LastName,sLastName); 
}
 
//Присваивание Имени
void TStudent::SetFirstName (char* sFirstName)
{
    strcpy(FirstName,sFirstName); 
}
 
//Присваивание отчества
void TStudent::SetPatronimyc (char* sPatronimyc)
{
    strcpy(Patronimyc, sPatronimyc); 
}
 
//Присваивание Группы
void TStudent::SetGroup (char* sGroup)
{
    strcpy(Group, sGroup); 
}
 
 
 
 
//Получение указателя на Фамилию
char* TStudent::GetLastName(void) 
{                                 
    return LastName;        }      
 
//Получение указателя на имя
char* TStudent::GetFirstName(void)  //Аналогично прошлой
{
    return FirstName;
}
 
//Получение указателя на Отчество
char* TStudent::GetPatronimyc(void)  //Так же аналогично
{
    return Patronimyc;
}
 
//Получение указателя на group
char* TStudent::GetGroup(void)  //Так же аналогично
{
    return Group;
}
 
 
 
 
//Возврат ссылки на дату рождения
int& TStudent::BornDate(void) //Возвращаем ссылку на ДатуРождения 
{
    return Born;
}
 
//Деструктор класса
 
TStudent::~TStudent()
{   cout << "Вызов деструктора" << endl;
    delete[] LastName; //Отчистим память которую мы выделили
    delete[] FirstName;//Отчистим память которую мы выделили
    delete[] Patronimyc;//Отчистим память которую мы выделили
    delete[] Group;//Отчистим память которую мы выделили
}
TStudent test(TStudent s){return s;}
TStudent test2 (TStudent &s){return s;}
TStudent& test3 (TStudent &s){return s;}
//Точка входа (главная функция)
void main(void)
{ char f[40], n[40], p[40], g[40];
int b;
    setlocale(LC_ALL,"Russian");
    cout<<"Вход ф-ции main :"<< endl;
    TStudent D1; //Создади объект класса конструктором по умолчанию
    //Заполним его
    cin >> f >> n >> p >> g >> b;
    D1.SetFirstName(n);
    D1.SetLastName(f);
    D1.SetPatronimyc(p);
    D1.SetGroup(g);
    D1.BornDate() = b;
    cout<< D1; //Выведим на экран 
 
    //Создадим объект констуктором копирования
    TStudent D2(D1);
    //Если все было реализованно верно, то указатели D2 не должны быть равны указателям D1
    //Проверим это следующим образом
    cout<<"Проверка конструктора копирования по умолчанию, путем замены первой буквы фамилии на 'F':"<< endl;
        
    D2.GetLastName()[0] ='F';//Изменим первый символ фамилии D1 на 'F'
     cout << D2; //Выведим на экран сначало D1 и D2 (результаты должны быть разными
    test(D1);  // 2 раза вызывается деструктор
    test2(D1);  // 1 раз
    test3(D1);  // деструктор не вызывается
    cout<<"Выход из ф-ции main :"<< endl;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.11.2013, 10:35     Класс со значением полей "по умолчанию"
Посмотрите здесь:

C++ Создать класс "точка" и производный класс "отрезок"
Абстрактный базовый класс "звонок" с виртуальной функцией "стоимость" C++
C++ Разработать класс "Массив больших чисел", который состоит из объектов класса "Большие целые числа". Найти сумму элементов массива.
C++ Иерархия: класс "карта", "колода карт"
C++ Класс "Графический объект", от которого будут наследоваться классы "круг" и "квадрат"
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Folko
 Аватар для Folko
265 / 253 / 7
Регистрация: 27.09.2013
Сообщений: 877
Записей в блоге: 1
11.11.2013, 10:47     Класс со значением полей "по умолчанию" #2
Адренс Аксидор, у меня программа запустилась (а дальше я не понял, что делать). Или у вас во время выполнения программы вылетает ошибка?
Адренс Аксидор
5 / 5 / 1
Регистрация: 16.05.2012
Сообщений: 92
11.11.2013, 10:52  [ТС]     Класс со значением полей "по умолчанию" #3
Я закомментировал то, что вызывает ошибку. Если конкретно, то строка 14 и 44, ошибка выскакивает непосредственно во время работы программы
Ilot
Модератор
Эксперт С++
1765 / 1140 / 221
Регистрация: 16.05.2013
Сообщений: 3,017
Записей в блоге: 5
Завершенные тесты: 1
11.11.2013, 11:00     Класс со значением полей "по умолчанию" #4
Один вопрос. Почему вы не пишете сколько выделяете памяти?
Или просто заносите в один байт символ окончания массива '\0'. Либо инициализируйте длинной имени перса при вводе с клавиатуры.
Kuzia domovenok
 Аватар для Kuzia domovenok
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
11.11.2013, 11:00     Класс со значением полей "по умолчанию" #5
Во-первых, string использовать тебе религия не позволяет?
Во-вторых, да, возможно ты упражняешься в ручном выделении памяти, но...
даже если заниматься самостоятельным выделением памяти, для строк должен быть отдельный самописный класс!!! Иначе, ты как индустри раза дублируешь одини тот же код в своем классе!
В-третьих, ты забыл при выделении памяти указать ее размер
C++
1
2
new char[size];
new char[];//неверно
Адренс Аксидор
5 / 5 / 1
Регистрация: 16.05.2012
Сообщений: 92
11.11.2013, 11:05  [ТС]     Класс со значением полей "по умолчанию" #6
У меня поначалу было выделение под 30 символов, но потом убрал, т.к. не понял как выделять непосредственно под нужное число символов. Я догадываюсь, что проблема в том, что сначала идет присваивание значения для поля, а потом только выделяется память. Прошу простить, если где-то туплю, это моя первая программа с классами.
Tulosba
11.11.2013, 11:07
  #7

Не по теме:

Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
new char[];//неверно
выделит 0 байт доказано. майкрософт.

Extrim88
 Аватар для Extrim88
50 / 50 / 11
Регистрация: 08.02.2013
Сообщений: 189
11.11.2013, 11:12     Класс со значением полей "по умолчанию" #8
В конструкторе по умолчанию, Line 44, делается попытка выделить память в пуле динамически распределяемой памяти под строки, как уже упоминалось не указывается размер массива для этой цели
C++
1
new[size]
, повторюсь с этим. Память то выделяется, а где инициализация элементов данных начальными значениями? Получается, что при создании объектов класса в таком случае значения элементов данных будут неопределенными.

Добавлено через 58 секунд
C++
1
new char[size]
т.е.
Адренс Аксидор
5 / 5 / 1
Регистрация: 16.05.2012
Сообщений: 92
11.11.2013, 11:57  [ТС]     Класс со значением полей "по умолчанию" #9
Я делал так или в строке 14, или в 44: char *LastName="Ivanov", char *FirstName="Ivan", char *Patronimyc="Ivanovich", char *Group="sdw23", int Born=23

Добавлено через 40 минут
Вот как было раньше. Можете помочь исправить? Я просто не знаю, как сделать так, чтобы выделялась память под нужно число символов

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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
#include <iostream>
using namespace std;
//Класс Студент
class TStudent
{
private:
    char *LastName; //Будем использовать указатели но определимся по размеру Фамилия не более 32 символов
    char *FirstName; //Имя не более 16 символов
    char *Patronimyc; //Отчество не более 32х символов
    int Born; //Год рождения
    char *Group; //Группа не более 10 символов
 
public:
    TStudent(); //Конструктор класса по умолчанию *просто выделим память под все поля
    
    ~TStudent(); //Деструтор класса
    TStudent (TStudent& Student); //Конструктор копирования по умолчанию
    TStudent operator= (TStudent& Student); //Оператор присвоения
    
    void SetLastName (char* sLastName);  //Присваивание Фамилии
    void SetFirstName (char* sFirstName);//Присваивание Имени
    void SetPatronimyc (char* sPatronimyc);//Приваивание отчества
    void SetGroup(char* sGroup);
 
    char* GetLastName(void); //Получение указателя на Фамилию
    char* GetFirstName(void);//Получение указателя на имя
    char* GetPatronimyc(void); //Получение указателя на Отчество
    int& BornDate(void); //Изменение даты рождения
    char* GetGroup(void);
    //Дружественная функция перезагрузки вывода в стандартный поток вывода (STDOUT)
    friend ostream& operator<< (ostream& out, TStudent Student)
    {
        out<<"Фамилия : "<< Student.LastName<< endl;
        out<<"Имя : "<< Student.FirstName<< endl;
        out<<"Отчество : "<< Student.Patronimyc<< endl;
         out<<"Группа : "<< Student.Group<< endl;
        out<<"Год рождения : "<< Student.Born<< endl<< endl;
        
        return out;
    }
 
};
//Конструктор по умолчанию *просто выделим память под все поля
TStudent::TStudent()
{
    //Выделим памяти для Фамилии, Имени и Отчества на которые указывают их указатели char*
    LastName = new char[32+1];
    memset(LastName,0,33);
    FirstName = new char[16+1];
    memset(FirstName,0,17);
    Patronimyc = new char[32+1];
    memset(Patronimyc, 0,33);
     Group = new char[10+1];
    memset(Group, 0,11);
};
//Конструктор копирования по-умолчанию
TStudent::TStudent (TStudent& Student)
{
    //В конструкторе копирования, так же выделим память на которые указывают указатели
    LastName = new char[32+1]; 
    FirstName = new char[16+1];
    Patronimyc = new char[32+1];
     Group = new char[10+1];
   
    //И скопируем в них значения из объекта класса на базе которого мы создаем объект путем копирования
    strcpy(LastName, Student.LastName);
    strcpy(FirstName, Student.FirstName);
    strcpy(Patronimyc, Student.Patronimyc);
    strcpy(Group, Student.Group);
    Born = Student.Born;
}
//Перезагрузка оператора присвоения 
TStudent TStudent::operator= (TStudent& Student) //Оператор присвоения
{
    strcpy(LastName, Student.LastName); 
    strcpy(FirstName, Student.FirstName);
    strcpy(Patronimyc, Student.Patronimyc);
      strcpy(Group, Student.Group);
    Born = Student.Born;
    return *this;
}
 
//Присваивание Фамилии
void TStudent::SetLastName (char* sLastName)
{
    strncpy(LastName,sLastName,32); //Скопируем с проверкой на длину что бы не было переполнения
}
 
//Присваивание Имени
void TStudent::SetFirstName (char* sFirstName)
{
    strncpy(FirstName,sFirstName,16); //Скопируем с проверкой на длину что бы не было переполнения
}
 
//Приваивание отчества
void TStudent::SetPatronimyc (char* sPatronimyc)
{
    strncpy(Patronimyc, sPatronimyc,32); //Скопируем с проверкой на длину что бы не было переполнения
}
 
//Приваивание Группы
void TStudent::SetGroup (char* sGroup)
{
    strncpy(Group, sGroup,11); //Скопируем с проверкой на длину что бы не было переполнения
}
 
 
 
 
//Получение указателя на Фамилию
char* TStudent::GetLastName(void) 
{                                 
    return LastName;              
 
//Получение указателя на имя
char* TStudent::GetFirstName(void)  //Аналогично прошлой
{
    return FirstName;
}
 
//Получение указателя на Отчество
char* TStudent::GetPatronimyc(void)  //Так же аналогично
{
    return Patronimyc;
}
 
//Получение указателя на group
char* TStudent::GetGroup(void)  //Так же аналогично
{
    return Group;
}
 
 
 
 
//Возврат ссылки на дату рождения
int& TStudent::BornDate(void) //Возвращаем ссылку на ДатуРождения 
{
    return Born;
}
 
//Деструктор класса
 
TStudent::~TStudent()
{
    delete[] LastName; //Отчистим память которую мы выделили
    delete[] FirstName;//Отчистим память которую мы выделили
    delete[] Patronimyc;//Отчистим память которую мы выделили
    delete[] Group;//Отчистим память которую мы выделили
}
 
 
 
//Точка входа (главная функция)
void main(void)
{ char f[32], n[16], p[32], g[16];
int b;
    setlocale(LC_ALL,"Russian");
    cout<<"Вход ф-ции main :"<< endl;
    TStudent D1; //Создади объект класса конструктором по умолчанию
    //Заполним его
    cin >> f >> n >> p >> g >> b;
    D1.SetFirstName(n);
    D1.SetLastName(f);
    D1.SetPatronimyc(p);
    D1.SetGroup(g);
    D1.BornDate() = b;
    cout<<"Конструктор по умолчанию + заполнение полей:"<< endl;
    cout<< D1; //Выведим на экран 
 
    //Создадим объект констуктором копирования
    TStudent D2(D1);
    //Если все было реализованно верно, то указатели D2 не должны быть равны указателям D1
    //Проверим это следующим образом
    cout<<"Проверка конструктора копирования по умолчанию, путем замены первой буквы фамилии на 'F':"<< endl;
    
    
    D2.GetLastName()[0] ='F';//Изменим первый символ фамилии D1 на 'F'
 
    cout << D2; //Выведим на экран сначало D1 и D2 (результаты должны быть разными
     cout<<"Выход из ф-ции main :"<< endl;
}
Ilot
Модератор
Эксперт С++
1765 / 1140 / 221
Регистрация: 16.05.2013
Сообщений: 3,017
Записей в блоге: 5
Завершенные тесты: 1
11.11.2013, 12:25     Класс со значением полей "по умолчанию" #10
Либо используйте класс string как вам указали выше. Ну если не ймется вычисляйте длину строки при инициализации.
Не правильно перегружаете операторы копирования и присвоения. Обязательно нужно освобождать занятую память и выделять новую. Примерно так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
TStudent::TStudent (TStudent& Student)
{
    delete [] LastName ; 
    delete [] FirstName;
    delete [] Patronimyc;
    delete [] Group;
    
    LastName    = new char[strlen(Student.LastName) + 1]; 
    FirstName   = new char[strlen(Student.FirstName) + 1]; 
    Patronimyc  = new char[strlen(Student.Patronimyc) + 1]; 
    Group       = new char[strlen(Student.Group) + 1]; 
   
    strcpy(LastName, Student.LastName);
    strcpy(FirstName, Student.FirstName);
    strcpy(Patronimyc, Student.Patronimyc);
    strcpy(Group, Student.Group);
    Born = Student.Born;
}
Боюсь только ошибиться с нулевым символом. Не помню ставится ли он ф-й strcpy. Это уж сами проверьте и допишите.
Аналогично для присвоения.
Tulosba
:)
Эксперт C++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
11.11.2013, 12:32     Класс со значением полей "по умолчанию" #11
Ilot, зачем в копирующем конструкторе delete ? Создается новый объект (старого нет), и удалять нечего. Это может быть актуально для оператора присваивания.
P.S. Параметр конструктора хорошо бы сделать const ссылкой.
Ilot
Модератор
Эксперт С++
1765 / 1140 / 221
Регистрация: 16.05.2013
Сообщений: 3,017
Записей в блоге: 5
Завершенные тесты: 1
11.11.2013, 12:45     Класс со значением полей "по умолчанию" #12
Tulosba, вы правы подумал про оператор присвоения, а написал для конструктора копирования.
Адренс Аксидор
5 / 5 / 1
Регистрация: 16.05.2012
Сообщений: 92
11.11.2013, 12:51  [ТС]     Класс со значением полей "по умолчанию" #13
Цитата Сообщение от Ilot Посмотреть сообщение
Либо используйте класс string как вам указали выше. Ну если не ймется вычисляйте длину строки при инициализации.

Аналогично для присвоения.
А как вычислить длину строки при инициализации? Мне вот это не совсем понятно, я ведь должен при написании конструктора в скобках указать значения по умолчанию:
C++
1
2
public:
    TStudent(char *LastName="Ivanov", char *FirstName="Ivan", char *Patronimyc="Ivanovich", char *Group="FGH21", int Bor17);
А уже потом:
C++
1
2
3
4
LastName = new char[];
       FirstName = new char[];
        Patronimyc = new char[];
     Group = new char[];
Т.е. нужно подсчитать число символов и перенести этот параметр в new char[x], но как это сделать я не совсем понимаю. Только с Паскаля на C++ перешел, еще не разобрался. Со string у меня возникает ошибка в функциях Set
Extrim88
 Аватар для Extrim88
50 / 50 / 11
Регистрация: 08.02.2013
Сообщений: 189
11.11.2013, 13:01     Класс со значением полей "по умолчанию" #14
C++
1
TStudent(char *LastName="Ivanov", char *FirstName="Ivan", char *Patronimyc="Ivanovich", char *Group="FGH21", int Bor17);
- совершенно неверно. Во-первых, имена формальных параметров должны отличаться от имен элементов данных, определенных в классе. Длину строки можно определить с пом-ю функции strlen(), но она возвращает длину без учета нулевого символа, это необходимо учесть. В конструктор передается указатель содержащий адрес строки, следовательно, длину строки можно определить таким образом
C++
1
strlen(s) + 1
, где s - указатель на строку и т.д.
Tulosba
:)
Эксперт C++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
11.11.2013, 13:04     Класс со значением полей "по умолчанию" #15
Цитата Сообщение от Extrim88 Посмотреть сообщение
Во-первых, имена формальных параметров должны отличаться от имен элементов данных, определенных в классе.
Совершенно не обязательно. В теле конструктора для членов можно добавлять this->, а в инициализаторе конструктора можно и без этого обойтись.
Адренс Аксидор
5 / 5 / 1
Регистрация: 16.05.2012
Сообщений: 92
11.11.2013, 13:08  [ТС]     Класс со значением полей "по умолчанию" #16
Странно, мне в университете преподаватель сказал, что нужно делать именно так.
C++
1
2
public:
    TStudent(char *LastName="Ivanov", char *FirstName="Ivan", char *Patronimyc="Ivanovich", char *Group="VD22", int Born=16);
Т.е. вместо, например, LastName нужно поставить другое имя?
Подсчет длины примерно так? Просто ошибка во время работы возникает
C++
1
2
3
4
5
6
7
8
TStudent::TStudent(char *LastName, char *FirstName, char *Patronimyc, char *Group, int Born)
{     cout << "Вызов конструктора" << endl;
    //Выделим памяти для Фамилии, Имени и Отчества на которые указывают их указатели char*
    LastName = new char[strlen(LastName)+1];
    FirstName = new char[strlen(FirstName)+1];
    Patronimyc = new char[strlen(Patronimyc) + 1];
    Group = new char[strlen(Group) + 1];
   };
Примерно так?
Extrim88
 Аватар для Extrim88
50 / 50 / 11
Регистрация: 08.02.2013
Сообщений: 189
11.11.2013, 13:09     Класс со значением полей "по умолчанию" #17
Вообще, если вы уж выбрали строки С- стиля, в отказ строкам, представленным с помощью
C++
1
string
, то необходимо понимать, что такие строки представляют из себя последовательность символов, завершающаяся нулевым символом и расположенная в последовательных ячейках памяти, ведь это ни что иное как символьный массив. Любая строка С-стиля, интерпретируется, как адрес, а именно адрес ее первого элемента - символа в памяти. Зная этот адрес, который можно как раз сохранить посредством указателя, можно получить доступ к любому символу строки, используя смещение относительно первого элемента в памяти, а также, использовать разные функции для обработки строки.
Kuzia domovenok
 Аватар для Kuzia domovenok
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
11.11.2013, 13:18     Класс со значением полей "по умолчанию" #18
Цитата Сообщение от Extrim88 Посмотреть сообщение
, то необходимо понимать, что такие строки представляют из себя последовательность символов, завершающаяся нулевым символом и расположенная в последовательных ячейках памяти, ведь это ни что иное как символьный массив. Любая строка С-стиля, интерпретируется, как адрес, а именно адрес ее первого элемента - символа в памяти. Зная этот адрес, который можно как раз сохранить посредством указателя, можно получить доступ к любому символу строки, используя смещение относительно первого элемента в памяти, а также, использовать разные функции для обработки строки.
к чему эти слова?
Extrim88
 Аватар для Extrim88
50 / 50 / 11
Регистрация: 08.02.2013
Сообщений: 189
11.11.2013, 13:24     Класс со значением полей "по умолчанию" #19
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
к чему эти слова?
Для справки, может ТС из вышесказанного что-то пригодится.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.11.2013, 13:28     Класс со значением полей "по умолчанию"
Еще ссылки по теме:

C++ Иерархия классов "список"-"очередь", вызов метода через класс интерфейс
C++ Создать класс "прямоугольник" и перегрузить операцию отношения "равно"
C++ Описать класс "Контейнер" как объект, предназначенный для транспортировки классов "Строительных блоков"

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

Или воспользуйтесь поиском по форуму:
Адренс Аксидор
5 / 5 / 1
Регистрация: 16.05.2012
Сообщений: 92
11.11.2013, 13:28  [ТС]     Класс со значением полей "по умолчанию" #20
Благодарю. Но можете всетаки непосредственно помочь с прогой. Что не так в том коде, что я выложил пару постов назад. И что нужно добавить-удалить в присваивании, просто delete[] и new я в каждую функцию добавлял, но это не помогло
Yandex
Объявления
11.11.2013, 13:28     Класс со значением полей "по умолчанию"
Ответ Создать тему
Опции темы

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