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

Классы, конструктор копирования (разбор куска программы) - C++

Восстановить пароль Регистрация
 
ZiP-777
0 / 0 / 0
Регистрация: 10.06.2011
Сообщений: 24
06.05.2012, 21:31     Классы, конструктор копирования (разбор куска программы) #1
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class string{
   char *str;
   void load(char *s)    { str=strdup(s); }
   void add(char *s)     { str=(char*)realloc(str,strlen(str)+strlen(s)+1);
                         strcat(str,s); }
   int find(char *s)     { char *p=strstr(str,s); return p==NULL ? -1 : p-str; }
   int cmp(string &t)    { return strcmp(str,t.str); }
public:
   string(){ load(""); }
   string(char *s){ load(s); }
   string(string &t){ load(t.str); add(t.str+1); }
   ~string() { delete str; }
   string   &operator=(string &r) { delete str; load(r.str); return *this; }
   string   operator+(string &r) { string t(str); t.add(r.str); return t; }
   };
   string &EMPTY(string &s) { return s; }
 
void main(){
   string s1,s2("ab"),s3=s2;
   s1=EMPTY(s2);
   }
Помогите разобрать, что делает данный кусок программы. Желательно построчно - на уровне работы компилятора. Спасибо.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.05.2012, 21:31     Классы, конструктор копирования (разбор куска программы)
Посмотрите здесь:

Классы, конструктор копирования C++
Классы. конструктор копирования C++
конструктор копирования C++
C++ Не могу сделать чтобы класс содержал основной конструктор и конструктор копирования
C++ Не могу правильно сделать конструктор и конструктор копирования и принадлежность точки с заданными координатами треугольнику
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
zss
Модератор
Эксперт С++
 Аватар для zss
5947 / 5552 / 1784
Регистрация: 18.12.2011
Сообщений: 14,184
Завершенные тесты: 1
06.05.2012, 22:03     Классы, конструктор копирования (разбор куска программы) #2
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class string{
   char *str; //Здесь храним текст строки
   void load(char *s)    { str=strdup(s); }// копирование строки
   void add(char *s)     { str=(char*)realloc(str,strlen(str)+strlen(s)+1);// слияние 2 строк
                         strcat(str,s); }
   int find(char *s)     { char *p=strstr(str,s); return p==NULL ? -1 : p-str; }//поиск подстроки
   int cmp(string &t)    { return strcmp(str,t.str); }// сравнение строк
public:
   string(){ load(""); }// конструктор без параметров
   string(char *s){ load(s); } // конструктор из текстовой строки
   string(string &t){ load(t.str); add(t.str+1); } // копиконструктор
   ~string() { delete str; } // деструктор
   string   &operator=(string &r) { delete str; load(r.str); return *this; }// перегрузка операции "равно"
   string   operator+(string &r) { string t(str); t.add(r.str); return t; }//перегрузка сложения строк
   };
   string &EMPTY(string &s) { return s; } // функция, которая ничего не делает.
 
void main(){
   string s1,s2("ab"),s3;// s1,s3 пустые строки, s2 - строка с ab
   s3=s2;// копирование строки через оператор =
   s1=EMPTY(s2);// копирование строки через оператор = и пустую функцию.
   }
UFO94
 Аватар для UFO94
263 / 252 / 13
Регистрация: 04.04.2012
Сообщений: 546
06.05.2012, 22:06     Классы, конструктор копирования (разбор куска программы) #3
По строкам:
1)Обьявление класса
2)У класса есть только 1 поле -- строка (массив символов) str
3)Метод, который делает строку такой же, как s
4,5)Метод, который дописывает в конец строки строку s
6)Метод, который ищет в составе строки str подстроку s, если находит, возвращает адрес ее начала (в символах от начала строки str), иначе -- -1
7)Метод, проверяющий одинаковость 2-х строк
8)Все методы выше и поле str были в области private, и программисту не доступны. Отныне идут доступные для программиста методы
9)Конструктор строки ""
10)Конструктор строки s -- фактически, преобразователь строки char* в string, может вызываться неявно
11)Конструктор копии строки t
12)Деструктор
13)Оператор, присваивающий строке строку r
14)Оператор, добавляющий к строке строку r
16)Без понятия. С моей точки зрения, абсолютно бессмусленная строка. Может, кто-то другой подскажет?
Jupiter
06.05.2012, 22:29
  #4

Не по теме:

Цитата Сообщение от ZiP-777 Посмотреть сообщение
Желательно построчно
это не значит что надо вытягивать методы в одну строку, так что сами и разбирайтесь в своем го*нокоде.
хотите чтоб ваш код читали - имейте совесть и пишите нормально

ZiP-777
0 / 0 / 0
Регистрация: 10.06.2011
Сообщений: 24
07.05.2012, 17:02  [ТС]     Классы, конструктор копирования (разбор куска программы) #5
Цитата Сообщение от Jupiter Посмотреть сообщение

Не по теме:


это не значит что надо вытягивать методы в одну строку, так что сами и разбирайтесь в своем го*нокоде.
хотите чтоб ваш код читали - имейте совесть и пишите нормально

Дело как раз в том, что код не мой, моя задача в нём разобраться. Спасибо всем откликнувшимся. Осталась пара вопросов по поводу работы операторов:
C++ (Qt)
1
2
 string   &operator=(string &r) { delete str; load(r.str); return *this; }
 string   operator+(string &r) { string t(str); t.add(r.str); return t; }
Для чего они вообще здесь нужны? Когда вызываются? Зачем нужен объект r, что там хранится?
zss
Модератор
Эксперт С++
 Аватар для zss
5947 / 5552 / 1784
Регистрация: 18.12.2011
Сообщений: 14,184
Завершенные тесты: 1
07.05.2012, 17:19     Классы, конструктор копирования (разбор куска программы) #6
Они перегружают операции "Равно" и "сложение":
C++
1
2
3
string s2,s1("aaaaa");
s2=s1; // используется operator=
s2=s1+s2; // используется operator+
А r - это string, который стоит справа от знаков = или +
Yandex
Объявления
07.05.2012, 17:19     Классы, конструктор копирования (разбор куска программы)
Ответ Создать тему
Опции темы

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