initial commit
This commit is contained in:
		
						commit
						2369f801af
					
				
					 76 changed files with 4273 additions and 0 deletions
				
			
		|  | @ -0,0 +1,52 @@ | |||
| #include <iostream> | ||||
| #include <cstdlib> | ||||
| using std::cout, std::endl; | ||||
| 
 | ||||
| 
 | ||||
| /*
 | ||||
|     В отличии от языка C, язык C++ не делает неявное преобразование типов указателей. | ||||
| 
 | ||||
|     Рассмотрим, например, код: | ||||
| 
 | ||||
|         int a = 10; | ||||
|         char* p = &a; | ||||
| 
 | ||||
|     В языке C такой код сработает, несмотря на то, что в строке  char* p = &a;  слева стоит указатель типа char* | ||||
|     а справа объект типа int*. Будет произведено неявное преобразование типов указателей. | ||||
| 
 | ||||
|     В языке C++ такой код приведёт к ошибке, так как C++ не преобразует указатели неявно. | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
|     Рассмотрим, например, код: | ||||
| 
 | ||||
|         int* q = malloc(10 * sizeof(int)); | ||||
| 
 | ||||
|     В языке C такой код сработает, несмотря на то, что слева стоит указатель типа int* | ||||
|     а справа объект типа void* (malloc возвращает указатель типа void*).  | ||||
|     Будет произведено неявное преобразование типов указателей. | ||||
| 
 | ||||
|     В языке C++ такой код приведёт к ошибке, так как C++ не преобразует указатели неявно. | ||||
| */ | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| int main() | ||||
| { | ||||
|     int a = 10; | ||||
|     char* p = &a; | ||||
| 
 | ||||
| 
 | ||||
|     int* q = malloc(10 * sizeof(int)); | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| /*
 | ||||
| 
 | ||||
|     Задача: | ||||
| 
 | ||||
|     Исправьте ошибки компиляции, явно приведя указатель к правильным типам.  | ||||
| 
 | ||||
| */ | ||||
|  | @ -0,0 +1,13 @@ | |||
| #include <iostream> | ||||
| #include <cstdlib> | ||||
| using std::cout, std::endl; | ||||
| 
 | ||||
| 
 | ||||
| int main() | ||||
| { | ||||
|     int a = 10; | ||||
|     char* p = (char*)&a; | ||||
| 
 | ||||
| 
 | ||||
|     int* q = (int*)malloc(10 * sizeof(int)); | ||||
| } | ||||
|  | @ -0,0 +1,17 @@ | |||
| #include <iostream> | ||||
| #include <cstdlib> | ||||
| using std::cout, std::endl; | ||||
| 
 | ||||
| 
 | ||||
| /*
 | ||||
|     В языке C++ желательно использовать более безопасное приведение типов static_cast | ||||
| */ | ||||
| 
 | ||||
| int main() | ||||
| { | ||||
|     int a = 10; | ||||
|     char* p = static_cast<char*>(&a); | ||||
| 
 | ||||
| 
 | ||||
|     int* q = static_cast<int*>(malloc(10 * sizeof(int))); | ||||
| } | ||||
							
								
								
									
										50
									
								
								seminar01_overload/classroom_tasks/code/04other/01nulptr.cpp
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										50
									
								
								seminar01_overload/classroom_tasks/code/04other/01nulptr.cpp
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,50 @@ | |||
| #include <cstdio> | ||||
| 
 | ||||
| /*
 | ||||
|     Новое специальное нулевое значение для указателя: nullptr | ||||
|     В языке C для этой цели использовался NULL, который был просто числом 0 | ||||
| 
 | ||||
|     Если определить NULL так:   | ||||
| 
 | ||||
|         #define NULL (void*)0 | ||||
| 
 | ||||
|     То, в отличии от языка C, в языке C++ простая строка вида: | ||||
| 
 | ||||
|         int* p = NULL; | ||||
| 
 | ||||
|     не сработает, так как слева стоит int* а справа void*  | ||||
| 
 | ||||
|      | ||||
|     Если определить NULL так:   | ||||
| 
 | ||||
|         #define NULL 0 | ||||
| 
 | ||||
|     то в C++ могут возникнуть проблемы с перегрузкой, как это показано ниже. | ||||
| 
 | ||||
| */ | ||||
| 
 | ||||
| void print(int value)  | ||||
| { | ||||
|     printf("Int: %d\n", value); | ||||
| } | ||||
| 
 | ||||
| void print(void* pointer)  | ||||
| { | ||||
|     printf("Pointer: %p\n", pointer); | ||||
| } | ||||
| 
 | ||||
| int main()  | ||||
| { | ||||
|     void* p1 = NULL; | ||||
|     void* p2 = nullptr; | ||||
| 
 | ||||
|     // Всё ОК (компилятор может выбрать функцию):
 | ||||
|     print(p1); | ||||
|     print(p2); | ||||
| 
 | ||||
|     // Тут неверно (компилятор не может выбрать перегруженную функцию, произойдёт ошибка):
 | ||||
|     print(NULL); | ||||
| 
 | ||||
|     // Тут всё OK:
 | ||||
|     print(nullptr); | ||||
| } | ||||
|  | @ -0,0 +1,42 @@ | |||
| #include <iostream> | ||||
| using std::cout, std::endl; | ||||
| 
 | ||||
| /*
 | ||||
|     В отличии от языка C, в C++ можно задавать значения по умолчанию | ||||
|     для аргументов функций | ||||
| 
 | ||||
|     Функцию printSquare можно вызвать с одним, двумя или тремя | ||||
|     параметрами. Аргументы width и height будут заданы аргументами по умолчанию. | ||||
|     Если передаваемых аргументов будет меньше трёх. | ||||
| */ | ||||
| 
 | ||||
| void printSquare(char c, int width = 10, int height = 5)  | ||||
| { | ||||
|     for (int i = 0; i < width; i++)  | ||||
|     { | ||||
|         for (int j = 0; j < height; j++)  | ||||
|         { | ||||
|             cout << c; | ||||
|         } | ||||
|         cout << endl; | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| int main()  | ||||
| { | ||||
|     printSquare('+', 6, 4); | ||||
|     printSquare('#', 15); | ||||
|     printSquare('O'); | ||||
|      | ||||
| 
 | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| /*
 | ||||
|     Задание: | ||||
| 
 | ||||
|     1) Написать функцию: | ||||
|         void print(char str[], bool isCapitalized = false) | ||||
|         Которая будет просто печатать строку str, если isCapitalized = false, | ||||
|         а если isCapitalized = true, то будет печатать всю строку в верхнем регистре | ||||
| */ | ||||
		Reference in a new issue