////////////////////////////// //Задание 8 (замена символа в строке) ////////////////////////////// //В задании со строкой в финальном, "хардкорном" варианте //Была допущена ошибка. Из-за нее первый символ строки никогда бы не обрабатывался. //Первоначальный вариант: void foo(char *sz){ while(*sz){ if(*sz == 'a') *sz = 'b'; ++sz; } } //"Хардкор" вариант: void foo(char *sz){ do{ if(*sz == 'a') *sz = 'b'; }while(*(++sz)); } //Проще, пожалуй, не написать. По понятным причинам, так писать не следует =) //////////////////////////////// //Задание 14 (перегрузка оператора) //////////////////////////////// //"Канонический" вариант перегрузки: class Complex{ public: double re, im; Complex(double re, double im = 0) : re(re), im(im){ ; } double norm(void) const{ //В примере здесь const нет, но он тут крайне желателен return sqrt (re*re + im*im); } //Далее перегружаем: /*const*/ Complex operator+(const Complex& c) const{ return Complex(this->re + c.re, this->im + c.im); //Создаем объект конструктором и сразу возвращаем } //Этот метод зануляет объект, нужен только для демонстрации void zero(void){ im = re = 0; } }; //Первый const здесь необязателен, он будет влиять на то, допустимы ли конструкции вида: Complex a, b; (a + b).zero(); //То есть, можно ли изменять объект (точнее, вызывать не const методы), полученный в результате операции //Зачем такое может быть надо, неясно, все равно объект временный и исчезнет как только завершится выражение. //Поэтому тут const тоже имеет смысл ставить. //А вот это будет работать всегда, вне зависимости от /*const*/, потому что метод norm объявлен const double nrm = (a + b).norm(); //Подумайте, чего кроме трех остальных арифметических операторов не хватает, чтобы класс стал идеален? =)