CPP_L1 .ppt
- Количество слайдов: 25
С++ n Язык программирования С++ был разработан на основе языка С Бьярном Страуструпом (Bjarne Stroustrup).
С++ n На первых порах (1980 год) язык носил условное название «С с классами» , а в 1983 году Рик Массити придумал название «С++» n Предшественники С++: C – BCPL – SIMULA 67 – Алгол 68 n С++ является надмножеством С, поэтому программы написанные на Си, могут обрабатываться компилятором языка С++
n На сегодняшний день язык Си++ является одним из наиболее универсальных языков программирования. Его использование лежит, в основном, в области создания высокоэффективных приложений пользовательского уровня, работающих со сложными динамическими структурами данных. n Многие из таких приложений могут быть созданы средствами других языков, таких как Java, Perl или Phyton. Но быстродействие результирующего кода, созданного компиляторами с языка Си++, находится вне конкуренции с кодом вышеперечисленных языков.
C++ как улучшенный С Лучший метод перевести программу с С на С++ просто перекомпилировать ее и проследить все появляющиеся ошибки
Отличие C++ от С
1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. аргументы, используемые по умолчанию ссылки параметры-ссылки функция, возвращающая значение типа ссылки встроенные функции операция : : перегруженные функции определение переменных константные значения имена-этикетки в enum, struct и union анонимные объединения гибкие операторы распределения памяти
1. Аргументы, используемые по умолчанию void Show. Message(char *msg, int x=0, int y=0); void Show. Msg( int x, int y=0, char *msg); //неверно Show. Message(” Error: Out of Memory ”, , 10); //неверно Show. Message(” Error: Out of Memory ”); Show. Message(” Error: Out of Memory ”, 10);
2. Ссылки #include <stdio. h> int value=10; int &refval=value; int main(void) { printf(” value = %d n ”, value); refval +=5; // Модификация через ссылку printf(” value = %d n ”, value); // 15 printf(” Адрес value равен %p n ”, &value ); printf(” Адрес refval равен %p n ”, &refval ); // Одинаково return(0); }
3. Параметры-ссылки #include <stdio. h> void Inc_val(int i) { i++; } // Получает параметр значением. Модификация не // влияет на оригинал void Inc_ptrl(int *i) { (*i)++; } // Получает адрес оригинала. Модифицирует // оригинал путем косвенной адресации void Inc_ref(int &i) { i++; } // Получает параметр ссылку. Модифицирует // оригинал !!!!! int main(void) { int j=10; printf(” J равняется %dn”, j); Inc_val(j); printf(” j=%dn ”), j); Inc_ptr(&j); printf(” j=%dn ”), j); Inc_ref(j); printf(” j=%dn ”), j); return(0); }
4. Функция, возвращающая значение типа ссылки #include <stdio. h> const int array. Size=0 x. F; static int val. Array[array. Size]; int& value. At(int indx) { return val. Array[indx]; } int main(void) { for (int i=0; i<array. Size; i++) value. At(i) = 1; for (int i=0; i<array. Size; i++) printf(” Значение[%d]=%dn ”, i , value. At(i); return(0); } #include <assert. h> int& value. At(int indx) { assert(indx >= 0); assert(indx < array. Size); return val. Array[indx]; }
5. Встроенные (inline) функции #include <stdio. h> inline void swap(int &i, int &j) { i ^= j ^= i ^= j; } // ^= присвоение исключающего ”или” (выполняется справа налево) int main(void) { int a=10, b=20; printf(” a=%d, b=%d n ”, a, b); swap(a, b); printf(” a=%d, b=%d n ”, a, b); return 0; }
Борланд С++ не допускает inline-расширений для функций: q q q применяющих операторы while, do/while, switch/case, for, goto; имеющих тип void и не содержащих оператора return; применяющих встроенный код ассемблера.
Компилятор выдаст сообщение об ошибке int i , j; int min(int i 1, int i 2); // прототип int main(void) { return min(i , j); } // Вызов inline int min(int i 1, i 2) { return i 1 > i 2 ? i 2 : i 1; } // Определение
Компилятор не выдаст сообщение об ошибке int i , j, k , l; inline int max(int i 1, int i 2); // прототип int func 1(void){return max(i , j); } // не расширяется как inline int max(int i 1, i 2) { return i 1 > i 2 ? i 1 : i 2; } int func 2(void) {return max(i , j); } // расширяется как inline !!!
6. Операция : : #include <stdio. h> int total=10; // Глобальная переменная int main(void) { int total=100; // Локальная переменная во внешней области действия if (total > 0) { int total = 1000; // Локальная переменная во внутренней области printf(” Локальная total %dn ”, total); printf(” Глобальная total %dn ”, : : total); } return 0; } }
7. Перегруженные функции #include <stdlib. h> #include <stdio. h> void Show. Message(int); void Show. Message( char *msg); void Show. Message(int err. Code) { printf( «MSG: %sn, sys_errlist[err. Code]); } void Show. Message(char *msg) { printf( «MSG: %sn» , msg); } int main(void) { Show. Message(1); // 1: Недействительный номер функции Show. Message (” Ошибка исправлена ”); return 0; }
Функции, отличающиеся только типом возвращаемого значения, не могут быть перегружены. Следующий код вызовет ошибку: int get. Cust. Info(char *name); char *get. Cust. Info(char *name); Функции не могут быть перегружены, если их параметры различаются только применением модификаторов const или volatile , или использованием ссылки. void Del. Rec(int indx); void Del. Rec(int &indx); void Del. Rec(const indx); void Del. Rec(volatile int indx);
Ниже показаны некоторые внутренние имена перегруженных функций: void func(int i); @func$qi int func(int i); @func$qi void func(char i); @func$qc void func(char *p); @func$qp.
8. Определения переменных #include <stdio. h> int main(void) { printf(” Привет!n ”); int i; printf(” Значение i= %d n ”, i); for ( int j=0; j<10; j++) // переменные определяются там, где в них появляется необходимость { printf(” j=%dn ”, j); printf(” Текущее значение j=%dn ”, j); } }
9. Константные значения const double pi = 3. 1415926535897932385; const char plus = '+'; Описание const гарантирует, что его значение не изменится в области видимости: const int model = 100; model = 145; // ошибка model++; // ошибка
10. Имена-этикетки в enum, struct и union enum Account {edu, corp, persnl }; enum { ASM, AUTO, BREAK }; struct cust. Info { char name[80]; long accnt. Num; Account Acc. Type; // вместо enum Account Acc. Type }; cust. Info c={” FD, Ltd. ”, 100, corp}; // без ключа struct
11. Анонимные объединения #include <string. h> static union { char cust. Name[80]; // Глобальное объединение long cust. Id; }; int main(void) { union { int new. Id; // Локальное объединение int counter; }; for (counter=0; counter<10; counter++) cust. Id=counter; strcpy(cust. Name, ” New ”); new. Id=0 x 100; return 0; }
12. Гибкие операторы распределения памяти #include <stdlib. h> #include <stdio. h> long *lptr; void f 1(void) { lptr=(long* )malloc(sizeof(long)); *lptr=0 x 1000; printf(” Значение равно %dn ”, *lptr); free(lptr); } void f 2(void) { lptr=new long; *lptr=0 x 1000; printf(” Значение равно %dn ”, *lptr); delete lptr; }
set_new_handler – определяемая пользователем процедура обработки ошибок #include <stdio. h> #include <stdlib. h> #include <new. h> void My. New. Handler( ) { printf(” Нет памяти!n ”); } int main(void) { set_new_handler(My. New. Handler); // Установит новый обработчик. . return 0; }
Переопределение new[ ] и delete[ ] void* operator new(size_t); void* operator new[ ](size_t); void operator delete(void*); void operator delete[ ](void*); #include <stdio. h> #include <stdlib. h> void* operator new(size_t size) // перекрыть глобальную операцию { printf(” new( ) запрашивает %d байт n ”, size); return malloc(size); } void operator delete(void *p) // перекрыть глобальную операцию { printf(” delete() n ”); free(p); }
CPP_L1 .ppt