initial commit

This commit is contained in:
nihonium 2022-09-01 16:37:41 +03:00
commit 2369f801af
Signed by: nihonium
GPG key ID: 0251623741027CFC
76 changed files with 4273 additions and 0 deletions

View file

@ -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));
}
/*
Задача:
Исправьте ошибки компиляции, явно приведя указатель к правильным типам.
*/

View file

@ -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));
}

View file

@ -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)));
}

View 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);
}

View file

@ -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, то будет печатать всю строку в верхнем регистре
*/