Тут будет сразу несколько вопросов, некоторые из них могут относиться не только к плюсам.
1. Почему типы const char* и char* не совместимы?
char* foo = "foo";
const char* bar = foo; // Ошибка
Почему так происходит? И то, и то — строки, но почему они не совместимы?
2. Можно ли считать код ниже конструктором копирования?
int zero = 0;
0 ведь имеет тип int, правильно?
3. Чем код выше отличается от этого:
int zero(0);
Или от этого
int zero = int(0);
Или от этого
int zero{0};
Или вообще от этого
int zero = int{0};
Какое различие между этими вариантами инициализации переменной и что из этого лучше использовать?
4. В продолжение к вопросу выше. Почему мы используем = в инициализации массивов?
int array[] { 1, 2, 3};
Почему не принято делать так?
5. Зачем нужны указатели на void, что они делают? Да как вообще можно указать на, то чего нет? Я слышал, что void на самом деле занимает 1 байт. Это реально так?
6. Это относится не только к плюсам, но всё же. Зачем нужны два вида инкремента/декремента (постфиксный и префиксный)?
7. Почему этот код выводит 1?
#include <iostream>
class Empty {};
int main(int argc, char** argv)
{
std::cout << sizeof(Empty{});
}
8. Кое-где вычитал, что return из main вызывает std::exit. Если это так, то как оно работает если не подключать стандартные библиотеки? Откуда берётся функция? (Тоже самое можно спросить про std::terminate, std::abort)
9. Как вообще реализована std::abort? Каким образом она работает?
10. Каким образом работает ввод/вывод? Как функции стандартной библиотеки могут поместить что-то куда-то, если ещё ничего для этого не реализовано?