распылить_на( кузов ) можешь покрасить кузов любой машины. При этом краскопульт поменяет состояние кузова машины.Лучше передавать указатель вместо неконстантной ссылки. Так из места вызова сразу видно, что передаваемое значение может меняться.
nullptr. Подобная семантическая нагрузка буквально неуместна в самом широком наборе вариантов, когда модификация аргумента оправдана.преподаватель спрашивает зачем они нужны
И это IMHO не только работать, это даже компилироваться не будет.
case. Чем в этом случае обделен if?doOther(); никогда не выполнится потому что исполнение прыгает только на метки case, но не перед ними. Исполнение дальше switch не пойдет, а всегда только куда-нибудь прыгнет. d-день, m-месяц,g-год,S-следующий день
d или day_number?m или month_number?S или next_day_number?а switch получается показывает, какие переменные нужно проверять в условии, которое написано в case
switch [?] и увидеть что проверка идет только для одного выражения. Я не просто так написал про int operator , ( int, int ), по умолчанию comma operator возвращает только свой правый аргумент.switch (d, m, g) эквивалентен switch (g).мне вроде удобно читать
Ввести день, месяц и год, проверить правильность введенной даты и вывести дату следующего дня.
int d, m, g, S;switch (d, m, g)int operator , ( int, int ), какой у него эффект по умолчанию?Давно ли внутри switch можно делать if?
case - это просто метка, на которую исполнение прыгает при соответствии условия. Локальность на все case едина - это локальность switch. Далее, после каждого case уже можно организовать свою локальность. Собственно, именно поэтому определение локальных переменных просто под case и сулит проблемами.return, то к моменту получения результата функции весь ее код завершен. Если бы использован co_yield, то к моменту получения результата код функции приостановлен.return функция еще продолжает работать, вызывая деструкторы локальных объектов и выполняя некоторый сервисный код. Только после этого результат из строки с кодом return будет передан в вызвавший функцию код. 1.5f?mult() у тебя только один первый аргумент имеет тип float, все остальные - double. strlen() вообще игнорирует терминальный символ в своей работе. Но функция его не учитывает только в своем результате, что и отражено в документации функции.strlen() при своей работе игнорирует терминальный символ. size_t size = 80;
string_ = new char[80]{""};size если она не используется?String(const char* string) {
delete[] string_;
size_t size = strlen(string);
strcpy_s(string_, size, string);
}delete[] string_; в этом месте будет означать delete[] nullptr;, т.е. нонсенс. Оператор delete[] ничего не освободит. В это время, strcpy_s(string_, size, string); будет означать strcpy_s(nullptr, size, string);, что приведет к падению.String(const String &str) {
size_t size = strlen(str.string_) + 1;
strcpy_s(string_, size, str.string_);
}resize() и reserve(), которые и должны управлять подконтрольным строке буфером памяти.concat() должен быть примерно таким:String String::concat(const String& other) const
{
String result;
result.reserve( length() + other.length() + 1 );
result = *this;
result += ' ';
result += other;
return result;
}
Не легче ли будет тебе самому обратиться к документации языка и изучить самые его основы?
Например, посмотреть документацию к
for[?] и усвоить обучающий материал. В чем у тебя сложность с этим?