Объяснить строку из книги
Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain
Здравствуйте! Начал изучать функции. Прочитал вот такую строку из темы "Функции", что-то не понятно. Вот строка:
При этом функции возвращают значение определённого типа
которое замещает в вызвавшем выражении,имя вызваной функции. Как понимать выделенный кусок? И ещё встретился такой кусок:
При отсутствии прототипов любая используемая функция, должна быть описана до её первого вызова в тексте.
При этом функции возвращают значение определённого типа
которое замещает в вызвавшем выражении,имя вызваной функции. Как понимать выделенный кусок? И ещё встретился такой кусок:
При отсутствии прототипов любая используемая функция, должна быть описана до её первого вызова в тексте.
Как и переменная - может использоваться только после объявления. прототип - это объявление функции, указывается до использования функции, чтобы компилятор мог проверить корректность передаваемых параметров и возвращаемого значения. Описание функции можно сделать и после. Первое слишком заумно, но это значит: на примере - для функции int GetValue();(это прототип функции не принимающей параметров и возвращающей значение целого типа) можно написать так: int a=GetValue(); - означает, что функция возвращает целое значение, которое присваивается переменной а.prikolist писал(а): При отсутствии прототипов любая используемая функция, должна быть описана до её первого вызова в тексте.
Это значит, что имя этой функции можно использовать везде, где есть переменная этого типа. Так называемое lvalue, т.е. ему присваивать нельзя. На вторую часть вопроса уже ответили.prikolist писал(а):При этом функции возвращают значение определённого типа
которое замещает в вызвавшем выражении,имя вызваной функции.
Оптимизация по скорости:
#define while if
Оптимизация по размеру:
#define struct union
#define while if
Оптимизация по размеру:
#define struct union
А как же "левые" функции?т.е. ему присваивать нельзя.
К примеру так:
Код: Выделить всё
int& min(int& a, int& b){return a < b ? a : b;}
//----------
// Где-то в программе
//----------
int x, y, z;
// Какой-то код
min(x, y) = z;
Эта функция (котолрая в примере) возвращает ... блин, как это по-русски-то называется...Rycharg писал(а):А как же "левые" функции?
К примеру так:Код: Выделить всё
int& min(int& a, int& b){return a < b ? a : b;}

Вообще, с подобным же успехом, я так понимаю, можно вернуть адрес, и тоже ставить слева, вот вроде этого:
Код: Выделить всё
int* min(int& a, int& b){return a < b ? &a : &b;}
//----------
// Где-то в программе
//----------
int x, y, z;
// Какой-то код
*(min(x, y)) = z;
В твоём примере, функция возвращает ссылку на int, т.е. синоним адреса памяти, которому можно присваивать. Поэтому эта функция не "левая", а очень даже "правая".Rycharg писал(а):А как же "левые" функции?
Оптимизация по скорости:
#define while if
Оптимизация по размеру:
#define struct union
#define while if
Оптимизация по размеру:
#define struct union
Немного поясню свою мысль.
Хорошо, согласен, пример подобран некорректно. Ибо присваивание производится не возвращаемому значению, а результату выражения(в моём примере результату авоматического разыменовывания указателя).
Согласен, присвоить функции возвращающей объект встроенного типа не получится, компилятор заматерит(и по праву, ибо ересь). Но! Чего бы стоил С++, если бы в нём были лишь встроенные типы? Короче говоря, всем извращенцам от программирования и по жизни посвящается.
a = b; - тоже выражение и поэтому слева от "=" может стоять вызов функции.При этом функции возвращают значение определённого типа
которое замещает в вызвавшем выражении,имя вызваной функции.
Хорошо, согласен, пример подобран некорректно. Ибо присваивание производится не возвращаемому значению, а результату выражения(в моём примере результату авоматического разыменовывания указателя).
Согласен, присвоить функции возвращающей объект встроенного типа не получится, компилятор заматерит(и по праву, ибо ересь). Но! Чего бы стоил С++, если бы в нём были лишь встроенные типы? Короче говоря, всем извращенцам от программирования и по жизни посвящается.
Код: Выделить всё
//---------------------------------------------------------------------------
#include <iostream.h>
//------------------------------------------
class cons_frame{
public:
int Width;
char Fill;
cons_frame& operator=(const char* val){
cout.width(Width);
cout.fill(Fill);
cout << "" << val;
cout.width(Width);
cout.fill(Fill);
cout << "" << endl;
return *this;
}
};
//------------------------------------------
cons_frame ConsFrame(int Width, char Fill){ // возвращаем ОБЪЕКТ
cons_frame X;
X.Width = Width;
X.Fill = Fill;
return X;
}
//------------------------------------------
int main(int argc, char* argv[]){
ConsFrame(20, '+') = "Privet"; // присваиваем возвращённому ОБЪЕКТУ
char a;
cin >> a;
return 0;
}
//------------------------------------------
Ты присваиваеш временному объекту, а не lvalue. lvalue (ему) присватвать нельзя. Всё в книге верно.
Оптимизация по скорости:
#define while if
Оптимизация по размеру:
#define struct union
#define while if
Оптимизация по размеру:
#define struct union