Разделы презентаций


Перегрузка операций

Правила перегрузки операцийДля перегрузки операции op надо определить функцию с именем operatorop.При перегрузке операции нельзя изменить ее приоритет, ассоциативность и количество связанных ею операндовДля вызова используется символ операции: Пример. Пусть

Слайды и текст этой презентации

Слайд 1Тема: Перегрузка операций
Оформление перегрузки операций
Правила перегрузки операций
Выбор типа функции-операции (функция-член

или функция-друг)
Модификация класса String

Тема: Перегрузка операцийОформление перегрузки операцийПравила перегрузки операцийВыбор типа функции-операции (функция-член или функция-друг)Модификация класса String

Слайд 2Правила перегрузки операций

Для перегрузки операции op надо определить функцию с

именем operatorop.

При перегрузке операции нельзя изменить ее приоритет, ассоциативность и

количество связанных ею операндов

Для вызова используется символ операции:
Пример. Пусть для типа String функция concat заменена перегруженной операцией “+”. Тогда конкатенация строк s1 и s2 будет записываться как s1+s2
Правила перегрузки операцийДля перегрузки операции op надо определить функцию с именем operatorop.При перегрузке операции нельзя изменить ее

Слайд 3Некоторые особенности
Можно перегружать следующие операции:
+ – * / %

^ & | ~ ! = < > += –=

*= /= %= ^= &= |= << >> >>= <<= == != <= >= && || ++ – – –>* , –> [ ] ( ) new new[ ] delete delete[ ]
Следующие операции не могут быть перегружены : “ :: ” , “ . ” , “ .* ” , “ ?: ”
Для перегруженных операций “ ++ ” и “ – – ” пре- и постфиксная формы неразличимы
Операции “ = ” , “ [ ] ” , “ ( ) ” , “ –> ” должны быть методами
Некоторые особенностиМожно перегружать следующие операции:	 + – * / % ^ & | ~ ! = <

Слайд 4Использование перегруженных операций
Операнды передаются в функцию перегруженной операции
как вызывающий

объект и аргумент (если операция является функцией-членом класса)
s1+s2 эквивалентно s1.operator+(s2)
как

аргументы (если операция не является функцией-членом класса
s1+s2 эквивалентно operator+(s1, s2)

Возвращаемое значение функции – значение выражения
Использование перегруженных операцийОперанды передаются в функцию перегруженной операции как вызывающий объект и аргумент (если операция является функцией-членом

Слайд 5Перегрузка операций
const int max_string_length = 128;
class String {
public:
String operator=

( char* ); // вместо set_to()
int length( );
int read( ); // чтение

из stdin
void print( ); // вывод в stdout
String substring (int start, int len);
// возвращает подстроку не изменяя оригинала
friend String operator+ ( String, String );
friend String operator+ ( String, char* );
friend String operator+ ( char*, String );
private:
// объект типа String – это последовательность из не более чем
// max_string_length символов, оканчивающаяся символом NULL
char text [ max_string_length+1 ];
};
Перегрузка операцийconst int max_string_length = 128;class String {	public: 		String operator= ( char* );	// вместо set_to()		int length( );		int

Слайд 6Обратите внимание на:
Тип операндов для операции “ + ”:
a+b,

а не &a+&b
хотя бы один аргумент перегруженной операции должен иметь

тип класса
Неэффективность передачи операндов при вызове операции “ + ”: по значению, а не через указатель
Присваивание переменных разных и одинаковых типов
String firstname, name;
firstname = “Bilbo”; // использует operator=(char*)
name = firstname; // использует умолчание
Возвращаемое значение перегруженной операции присваивания определяется выбором синтаксиса
a=b; if( (a=b) == c ) {…}
Обратите внимание на:Тип операндов для операции “ + ”: a+b, а не &a+&bхотя бы один аргумент перегруженной

Слайд 7Определение функции operator=
#include “mystring.h”
#include
// использование: s = “Hello

World”
String String::operator=( char* s ) {
strncpy( text, s, max_string_length

);
text [max_string_length] = ‘\0’;
return *this;
}
Определение функции operator=#include “mystring.h”#include  // использование: s = “Hello World”String String::operator=( char* s ) { 	strncpy(

Слайд 8Функция operator+( String, String )
#include “mystring.h”
#include // для стандартных

строковых функций
#include
#include // для exit()
// можно реализовать в

виде метода
String operator+( String s1, String s2 ) {
if( s1.length()+s2.length() > max_string_length ) {
fprintf( stderr, “string too large: \"%s %s\".\n", s1.text, s2.text );
exit(1);
}
String both;
strcpy( both.text, s1.text );
strcat( both.text, s2.text );
return both;
}
Функция operator+( String, String )#include “mystring.h”#include  // для стандартных строковых функций#include #include  // для exit()//

Слайд 9Функция operator+( String , char* )
#include “mystring.h”
#include // для

стандартных строковых функций
#include
#include // для exit()
// можно реализовать

в виде метода
String operator+( String s1 , char* s2 ) {
if( s1.length()+strlen(s2) > max_string_length ) {
fprintf( stderr, “string too large: \"%s %s\".\n", s1.text, s2 );
exit(1);
}
String both;
strcpy( both.text, s1.text );
strcat( both.text, s2 );
return both;
}
Функция operator+( String , char* )#include “mystring.h”#include  // для стандартных строковых функций#include #include  // для

Слайд 10Функция operator+( char* , String )
#include “mystring.h”
#include // для

стандартных строковых функций
#include
#include // для exit()
// нельзя реализовать

в виде метода
String operator+( char* s1 , String s2 ) {
if( strlen(s1) + s2.length() > max_string_length ) {
fprintf( stderr, “string too large: \"%s %s\".\n", s1 , s2.text );
exit(1);
}
String both;
strcpy( both.text, s1);
strcat( both.text, s2.text );
return both;
}
Функция operator+( char* , String )#include “mystring.h”#include  // для стандартных строковых функций#include #include  // для

Слайд 11#include “mystring.h”
void main( int, char** ) {
String first, last, full;
first

= “Bilbo”; last = “Baggins”;
// оба присваивания вызывают метод operator=(char*)
full

= first + “ ” + last;
// сперва вызывается друг operator+(String , char*)
// а затем друг operator+(String , String )
( “Name is: ” + full ).print( );
// вызывается друг operator+( char* , String )
// а затем метод print( ) для анонимного объекта
}

Использование операций класса

#include “mystring.h”void main( int, char** ) {	String first, last, full;	first = “Bilbo”;	last = “Baggins”;		// оба присваивания вызывают

Слайд 12РЕЗЮМЕ
В С++ можно определять функции-операции для разрабатываемых типов данных
Позволяет писать

изящный простой и понятный код
Нельзя изменить приоритет, число операндов или

ассоциативность определяемой операции
Нельзя придумать новые операции
Нельзя переопределить операции встроенных типов
Хотя бы один аргумент должен быть типа класса
Не всегда реализуемы в виде методов
РЕЗЮМЕ	В С++ можно определять функции-операции для разрабатываемых типов данныхПозволяет писать изящный простой и понятный кодНельзя изменить приоритет,

Слайд 13Упражнение
Изменить в классе String методы is_the_same_as и is_different_from на операции

“==” и “!=”. Прототипы функций имеют вид:
int opetor!=( String );
int

opetor==( String );
Протестируйте следующий синтаксис:
УпражнениеИзменить в классе String методы is_the_same_as и is_different_from на операции “==” и “!=”. Прототипы функций имеют вид:		int

Слайд 14#include “mystring.h"
#include
void main(int, char *[]) {
String

h1, h2, w;
h1 = "hello";

h2 = "hello";
w = "world";

printf("\n String == String ");
if ( h1 == h2 && !( h1 == w ) )
printf("works.\n");
else
printf("doesn't work.\n");

printf("\n String != String ");
if ( !(h1 != h2) && h1 != w )
printf("works.\n");
else
printf("doesn't work.\n");

printf("\n String == char* ");
if( h1==“hello” && !( h1==“world”) )
printf("works.\n");


else
printf("doesn't work.\n");

printf("\n String != char*");
if ( !(h1 != “hello”) && h1 != “world” )
printf("works.\n");
else
printf("doesn't work.\n");

printf("\n char* == String ");
if ( “hello” == h1 && !( “world” == h1) )
printf("works.\n");
else
printf("doesn't work.\n");

printf("\n char* != String ");
if ( !(“hello” != h1) && “world” != h1 )
printf("works.\n");
else
printf("doesn't work.\n");
}

Обратная связь

Если не удалось найти и скачать доклад-презентацию, Вы можете заказать его на нашем сайте. Мы постараемся найти нужный Вам материал и отправим по электронной почте. Не стесняйтесь обращаться к нам, если у вас возникли вопросы или пожелания:

Email: Нажмите что бы посмотреть 

Что такое TheSlide.ru?

Это сайт презентации, докладов, проектов в PowerPoint. Здесь удобно  хранить и делиться своими презентациями с другими пользователями.


Для правообладателей

Яндекс.Метрика