распылить_на( кузов )
можешь покрасить кузов любой машины. При этом краскопульт поменяет состояние кузова машины.Лучше передавать указатель вместо неконстантной ссылки. Так из места вызова сразу видно, что передаваемое значение может меняться.
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
[?] и усвоить обучающий материал. В чем у тебя сложность с этим?