#ifndef _STRING2_H_
#define _STRING2_H_
#include <iostream>
#include <cstring>
#include <cctype>
class String
{
public:
explicit String(const char* c = "");
String(const String& s);
~String();
const String& operator =(const String& s);
const String& operator +(const String& s);
void to_lower();
void show() const;
size_t size() const;
private:
char* line;
size_t len;
};
#endif // _STRING2_H_
Перегрузка функций
Определить класс-строку. В класс включить два конструктора: для определения класса строки строкой символов и путем копирования другой стро-ки (объекта класса строки).
Определить операции над строками:
+ конкатенация двух строк;(непонятно что такое)
++ преобразование символов строки в строчные (маленькие) символы.
У одного меня дежавю?
String2.h
Код:
String2.cpp
Код:
#include "String2.h"
String::String(const char* c)
{
len = strlen(c);
line = new char[len + 1];
strcpy(line, c);
}
String::String(const String& s)
{
len = s.len;
line = new char[len + 1];
strcpy(line, s.line);
}
String::~String()
{
delete [] line;
}
const String& String::operator =(const String& s)
{
if (this == &s) return *this;
delete [] line;
len = strlen(s.line);
line = new char[len + 1];
strcpy(line, s.line);
return *this;
}
const String& String::operator +(const String& s)
{
size_t len_sum = len + s.len;
char* temp = new char[len + 1];
strcpy(temp, line);
delete [] line;
line = new char[len_sum + 1];
strcpy(line, temp);
strcat(line, s.line);
delete [] temp;
len = strlen(line);
return *this;
}
void String::to_lower()
{
for (size_t i = 0; i < len; ++i)
{
line = tolower(line);
}
}
void String::show() const
{
std::cout << line << std::endl;
}
size_t String::size() const
{
return len;
}
String::String(const char* c)
{
len = strlen(c);
line = new char[len + 1];
strcpy(line, c);
}
String::String(const String& s)
{
len = s.len;
line = new char[len + 1];
strcpy(line, s.line);
}
String::~String()
{
delete [] line;
}
const String& String::operator =(const String& s)
{
if (this == &s) return *this;
delete [] line;
len = strlen(s.line);
line = new char[len + 1];
strcpy(line, s.line);
return *this;
}
const String& String::operator +(const String& s)
{
size_t len_sum = len + s.len;
char* temp = new char[len + 1];
strcpy(temp, line);
delete [] line;
line = new char[len_sum + 1];
strcpy(line, temp);
strcat(line, s.line);
delete [] temp;
len = strlen(line);
return *this;
}
void String::to_lower()
{
for (size_t i = 0; i < len; ++i)
{
line = tolower(line);
}
}
void String::show() const
{
std::cout << line << std::endl;
}
size_t String::size() const
{
return len;
}
Ну, и небольшой драйвер, демонстрирующий требуемые возможности класса.
main.cpp
Код:
#include <iostream>
#include "String2.h"
int main()
{
String A("If I fell in love with you ");
String B(A);
A.show();
B.show();
String C("Could you promise to be true");
C.show();
String D;
D = B + C;
D.show();
D.to_lower();
D.show();
return 0;
}
#include "String2.h"
int main()
{
String A("If I fell in love with you ");
String B(A);
A.show();
B.show();
String C("Could you promise to be true");
C.show();
String D;
D = B + C;
D.show();
D.to_lower();
D.show();
return 0;
}
В MSVS компилятор может ругаться на использование "небезопасных" функций strcpy() и strcat(), но их новые функции strcpy_s() и т.п. к стандарту никакого (по-моему) отношения не имеют. По крайней мере gcc о них ничего не знает.
P.S. Конкатенация - операция "склеивания" объектов.
Цитата: Lerkin
У одного меня дежавю?
В какой раз?? Сотый? Даже я уже наизусть выучил текст темы, хотя здесь недавно...