Главная Случайная страница


Полезное:

Как сделать разговор полезным и приятным Как сделать объемную звезду своими руками Как сделать то, что делать не хочется? Как сделать погремушку Как сделать так чтобы женщины сами знакомились с вами Как сделать идею коммерческой Как сделать хорошую растяжку ног? Как сделать наш разум здоровым? Как сделать, чтобы люди обманывали меньше Вопрос 4. Как сделать так, чтобы вас уважали и ценили? Как сделать лучше себе и другим людям Как сделать свидание интересным?


Категории:

АрхитектураАстрономияБиологияГеографияГеологияИнформатикаИскусствоИсторияКулинарияКультураМаркетингМатематикаМедицинаМенеджментОхрана трудаПравоПроизводствоПсихологияРелигияСоциологияСпортТехникаФизикаФилософияХимияЭкологияЭкономикаЭлектроника






Void ToLower(void);





int GetLength(void) const; // неизменяемый метод

// сообщить длину строки

private:

char* str;

int length;};

n если аргументом какой-либо функции объявлена ссылка на неизменяемый объект, то, соответственно, эта функция может вызывать только методы, объявленные как const:

int Lexer::CharCounter(const String& s, char c)

{ int n = s.GetLength(); // допустимо

s.Concat("ab");

// ошибка – Concat изменяет значение s }

 

Общее правило

n Для предотвращения случайных ошибок рекомендуется как можно больше методов объявлять как const, так как объявление константных аргументов запрещает изменение объектов во время выполнения функций

n Переопределение операций
Язык С++ позволяет определять в классах особого вида методы – операции.

n Они называются операциями потому, что их запись имеет тот же вид, что и запись операции сложения, умножения и т.п. со встроенными типами языка С++.

Пример 1

n Определим две операции в классе String – сравнение на меньше и сложение:

class String
{
public:
...
String operator+(const String& s) const;
bool operator<(const String& s) const;
};

В остальном операция мало чем отличается от обычного метода класса. Теперь в программе можно записать:

String s1, s2;
...
s1 + s2

Объект s1 выполнит метод operator с объектом s2 в качестве аргумента.

n Результатом операции сложения является объект типа String. Никакой из аргументов операции не изменяется.

n Описатель const при описании аргумента говорит о том, что s2 не может измениться при выполнении сложения.

n Описатель const в конце определения операции говорит то же самое об объекте, выполняющем сложение.

n Реализация может выглядеть следующим образом:


String
String::operator+(const String& s) const
{
String result;
result.length = length + s.length;
result.str = new char[result.length + 1];
strcpy(result.str, str);
strcat(result.str, s.str);
return result;
}

n При сравнении на меньше мы будем сравнивать строки в лексикографической последовательности.

n То есть меньше та строка, которая должна стоять раньше по алфавиту:
bool
String::operator<(const String& s) const
{
char* cp1 = str;
char* cp2 = s.str;
while (true) {
if (*cp1 < *cp2)
return true;
else if (*cp1 > *cp2)
return false;
else {
cp1++;
cp2++;
if (*cp2 == 0) // конец строки
return false;
else if (*cp1 == 0) // конец строки
return true;
}

}

}

Преобразования типов

n Преобразованием типов – преобразование, при котором типы величин, участвующие в выражении, преобразуются к типам, для которых операция задана. При этом в заданном выражении используются операции с типами, для которых она (операция) явно не задана.

Явные преобразования типов

n Если перед выражением указать имя типа в круглых скобках, то значение выражения будет преобразовано к указанному типу:

double x = (double)1;
void* addr;
Complex* cptr = (Complex*) addr;

n Главный недостаток – полное отсутствие контроля

n Для того чтобы преобразовывать типы, хотя бы с минимальным контролем, можно записать
static_cast < тип > (выражение)

Операция static_cast позволяет преобразовывать типы, основываясь лишь на сведениях о типах выражений, известных во время компиляции, то есть static_cast не проверяет типы выражений во время выполнения.

Стандартные преобразования типов

n К стандартным преобразованиям относятся преобразования целых типов и преобразования указателей. Они выполняются компилятором автоматически.

n Величины типа char, unsigned char, short или unsigned short преобразуются к типу int, если точность типа int достаточна, в противном случае они преобразуются к типу unsigned int.

n Величины типа wchar_t и константы перечисленных типов преобразуются к первому из типов int, unsigned int, long и unsigned long, точность которого достаточна для представления данной величины.

n Битовые поля преобразуются к типу int, если точность типа int достаточна, или к unsigned int, если точность unsigned int достаточна. В противном случае преобразование не производится.

n Логические значения преобразуются к типу int, false становится 0 и true становится 1.

Правила стандартных преобразований при выполнении арифметических операций

n вначале, если в выражении один из операндов имеет тип long double, то другой преобразуется также к long double;

n в противном случае, если один из операндов имеет тип double, то другой преобразуется также к double;

n в противном случае, если один из операндов имеет тип float, то другой преобразуется также к float;

n в противном случае производится безопасное преобразование.

 

n затем, если в выражении один из операндов имеет тип unsigned long, то другой также преобразуется к unsigned long;

n в противном случае, если один из операндов имеет тип long, а другой – unsigned int, и тип long может представить все значения unsigned int, то unsigned int преобразуется к long, иначе оба операнда преобразуются к unsigned long;

n в противном случае, если один из операндов имеет тип long, то другой преобразуется также к long;

n в противном случае, если один из операндов имеет тип unsigned, то другой преобразуется также к unsigned;
в противном случае оба операнда будут типа int.

Все приведенные преобразования типов производятся компилятором автоматически, и обычно при компиляции даже не выдается никакого предупреждения, поскольку не теряются значащие цифры или точность результата.

К сведению

n При выполнении операции присваивания со стандартными типами может происходить потеря точности.

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

n Например, при попытке присваивания
long x;
char c;
c = x;

При этом если значение x равно 20, то и c будет равно 20. Но если x равно 500, значение c будет равно -12, поскольку старшие биты, не помещающиеся в char, будут обрезаны.

n Именно поэтому большинство компиляторов выдаст ошибку и не будет транслировать подобные конструкции.

Шаблоны классов.
Назначение шаблонов

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

if (a < b)
x = a;
else
x = b;

Независимо от того, к какому именно типу принадлежат переменные a, b и x, если это один и тот же тип, для которого определена операция "меньше", запись будет одна и та же.

Было бы естественно определить функцию min, возвращающую минимум из двух своих аргументов.

Date: 2015-11-15; view: 275; Нарушение авторских прав; Помощь в написании работы --> СЮДА...



mydocx.ru - 2015-2024 year. (0.007 sec.) Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав - Пожаловаться на публикацию