Вот довольно реалистичный пример класса string. В нем производится учет ссылок на строку с целью минимизировать копирование и в качестве констант применяются стандартные символьные строки C++.
#include
#include
class string {
struct srep {
char* s; // указатель на данные
int n; // счетчик ссылок
};
srep *p;
public:
string(char *); // string x = "abc"
string(); // string x;
string(string &); // string x = string ...
string& operator=(char *);
string& operator=(string &);
~string();
char& operator[](int i);
friend ostream& operator<<(ostream&, string&);
friend istream& operator>>(istream&, string&);
friend int operator==(string& x, char* s)
{return strcmp(x.p->s, s) == 0; }
friend int operator==(string& x, string& y)
{return strcmp(x.p->s, y.p->s) == 0; }
friend int operator!=(string& x, char* s)
{return strcmp(x.p->s, s) != 0; }
friend int operator!=(string& x, string& y)
{return strcmp(x.p->s, y.p->s) != 0; }
};
Конструкторы и деструкторы просты (как обычно):
string::string()
{
p = new srep;
p->s = 0;
p->n = 1;
}
string::string(char* s)
{
p = new srep;
p->s = new char[ strlen(s)+1 ];
strcpy(p->s, s);
p->n = 1;
}
string::string(string& x)
{
x.p->n++;
p = x.p;
}
string::~string()
{
if (--p->n == 0) {
delete p->s;
delete p;
}
}
Как обычно, операции присваивания очень похожи на конструкторы. Они должны обрабатывать очистку своего первого (левого) операнда:
string& string::operator=(char* s)
{
if (p->n > 1) { // разъединить себя
p-n--;
p = new srep;
}
else if (p->n == 1)
delete p->s;
p->s = new char[ strlen(s)+1 ];
strcpy(p->s, s);
p->n = 1;
return *this;
}
Благоразумно обеспечить, чтобы присваивание объекта самому себе работало правильно:
string& string::operator=(string& x)
{
x.p->n++;
if (--p->n == 0) {
delete p->s;
delete p;
}
p = x.p;
return *this;
}
Операция вывода задумана так, чтобы продемонстрировать применение учета ссылок. Она повторяет каждую вводимую строку (с помощью операции <<, которая определяется позднее):
ostream& operator<<(ostream& s, string& x)
{
return s << x.p->s << " [" << x.p->n << "]n";
}
Операция ввода использует стандартную функцию ввода символьной строки.
istream& operator>>(istream& s, string& x)
{
char buf[256];
s >> buf;
x = buf;
cout << "echo: " << x << "n";
return s;
}
Для доступа к отдельным символам предоставлена операция индексирования. Осуществляется проверка индекса:
void error(char* p)
{
cerr << p << "n";
exit(1);
}
char& string::operator[](int i)
{
if (i<0 || strlen(p->s)s[i];
}
Головная программа просто немного опробует действия над строками. Она читает слова со ввода в строки, а потом эти строки печатает. Она продолжает это делать до тех пор, пока не распознает строку done, которая завершает сохранение слов в строках, или не встретит конец файла. После этого она печатает строки в обратном порядке и завершается.
main()
{
string x[100];
int n;
cout << "отсюданачнемn";
for (n = 0; cin>>x[n]; n++) {
string y;
if (n==100) error("слишкоммногострок");
cout << (y = x[n]);
if (y=="done") break;
}
cout << "отсюда мы пройдем обратноn";
for (int i=n-1; 0<=i; i--) cout << x[i];
}
Другие работы по теме:
А. Тюрго об эволюции классовой структуры буржуазного общества (Контрольная)
А. Тюрго об эволюции классовой структуры буржуазного общества. А. Тюрго- это замечательный мыслитель и государственный деятель Франции. Он относился к течению физиократов. Анн Робер Жак развивал далее труды своего учителя и обогащал доктрину физиократии новыми суждениями о классовой структуре общества, о происхождении наёмного трудах и о многом другом.
Сочинения на свободную тему - Сказание о лыжном походе
Как-то раз собрался Наш весь класс, Наш весь класс, На досуге от учебы В рощу погулять, В рощу погулять, На лыжах покататься. Собирались, собирались, Только двое собрались. Самые отважные, самые умелые, Стойкие да смелые. А учитель физкультуры На морозе коченел, На морозе коченел, Ожидая, как весь класс, Как весь класс к нему придет.
работа
С клавиатуры вводится текстовое предложение (до 70 символов) и определяется частота появления каждого символа в нём
Математика матрица
Матрицы Матрица - прямоугольная (в частном случае квадратная) таблица с числами. Матрица m Ч n - это таблица из m строк и n столбцов. Если m = n, матрицу называют квадратной матрицей порядка n.
Анна Ахматова 2
Анна Ахматова Неизвестное стихотворение Публикация и комментарий Анатолия Наймана версия для печати (22758) « ‹ – › » Безумцы! Я сама не знаю, Не знаю я куда иду –
Мой Маяковский
Мне кажется, что главная особенность всех произведений Владимира Владимировича в том, что буквально каждое слово, каждая строка любого стихотворения пытается нещадно обнажить душу самого Маяковского.
Как я писала свое первое сочинение
Автор: Сочинения на свободную тему Все люди в своей жизни что-либо делают впервые и запоминают этот момент на всю жизнь. Эх! Помню свой первый класс, как я впервые переступила порог школы и впервые села за парту.Первый класс- самый сложный период в жизни ребенка, он привыкает к новой жизни,начинает делать уроки и становится более самостоятельным человеком.
Богоматерь Донская
Феофан Грек "Донская Богоматерь" Написан : Хваталина Ира Класс : 11-3 УВК : 1828 Проверен : Оценка : 1999 Год
Декурион
(Decurio) 1) представитель декурии, главным образом начальник декурии всадников (decurio equitum); 2) член муниципального совета (куриал). В IV в. н.э. декурионы образовали в провинциях наследственную аристократию в связи с поземельной собственностью. В эпоху падения империи этот класс занимал почти все должности и был ими совершенно подавлен.
Список кораблей и судов ВМС США
Введение 1 Авианосцы 2 Десантные корабли 3 Плавающие транспортные доки 4 Корабли береговой высадки 5 Судна для спец операций 6 Вспомогательные 6.1 Судня обеспечения
Табель о рангах
При равенстве класса по "Табели" военный чин считался выше придворного, а придворный выше гражданского. Чины в гвардии считались до 1884 года на два класса выше чем в армии, с1884 года на один класс выше.
Простые ODBC классы без использования MFC
Мне пришлось написать довольно много приложений связанных с базами данных. Большинство из них было небольшими и использовали MFC класс CRecordset. Зависимость от MFC меня не всегда устраивала и тогда я засел за создание собственного класса.
Присваивание и Инициализация
Строка - это структура данных, состоящая из вектора символов и длины этого вектора. Вектор создается конструктором и уничтожается деструктором. Однако это может привести к неприятностям.
Добавление к Классу
Для производного класса можно определить данные и функции дополнительно к тем, которые наследуются из его базового класса. Это дает альтернативную стратегию обеспечить средства связанного списка.
Экзаменационные билеты по Информатика
Первые вопросы: Устройство и архитектура компьютера. Виды информации: текст, звук. Виды информации: графика, анимация, видео. Единицы измерения информации. Системы исчисления.
Программное определение числовых массивов
Одномерные числовые массивы, образование элементами целочисленного массива невозрастающей последовательности. Программное нахождение суммы элементов каждой возможной строки матрицы и формирование массива из найденных сумм, вывод массива-результата.
Поиск в лабиринте
Реализация алгоритма поиска, его составляющие. Считывание матрицы лабиринта из файла, нахождение в нем свободных мест. Иерархия классов для работы в графическом режиме и вывода необходимого на экран. Дополнительные типы данных, используемые в программе.
Отчётность в Excel
Наша задача создать отчётность в Excel. Эта потребность может возникнуть у каждого программиста баз данных, ведь Office установлен в нашей стране практически на каждом компьютере.
Анализ области определения функции
Постановка задачи Анализ области определения функции Рабочий лист Excel в режиме отображения значений Рабочий лист Excel в режиме отображения формул
Разработка финансового плана организации
По данным объема производства, затрат материалов, заработной платы рабочих и условно-постоянным расходам разработан финансовый план организации. Рассчитаны объем реализованной продукции, плановая себестоимость, финансовые результаты, уставный капитал.
Система простейших
Система простейших Простейшие с организацией жгутиконосцев(Mastigophora) ТИП МНОГОЖГУТИКОВЫЕ (Polymastigota) Класс РЕТОРТОМОНАДОВЫЕ (Retortamonada)