Объяснить строку из книги

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Ответить
prikolist
Сообщения: 38
Зарегистрирован: 19 ноя 2008, 13:09

Здравствуйте! Начал изучать функции. Прочитал вот такую строку из темы "Функции", что-то не понятно. Вот строка:

При этом функции возвращают значение определённого типа
которое замещает в вызвавшем выражении,имя вызваной функции. Как понимать выделенный кусок? И ещё встретился такой кусок:

При отсутствии прототипов любая используемая функция, должна быть описана до её первого вызова в тексте.
Albor
Сообщения: 491
Зарегистрирован: 06 сен 2004, 13:34
Откуда: Днепропетровск

prikolist писал(а): При отсутствии прототипов любая используемая функция, должна быть описана до её первого вызова в тексте.
Как и переменная - может использоваться только после объявления. прототип - это объявление функции, указывается до использования функции, чтобы компилятор мог проверить корректность передаваемых параметров и возвращаемого значения. Описание функции можно сделать и после. Первое слишком заумно, но это значит: на примере - для функции int GetValue();(это прототип функции не принимающей параметров и возвращающей значение целого типа) можно написать так: int a=GetValue(); - означает, что функция возвращает целое значение, которое присваивается переменной а.
Аватара пользователя
Airhand
Сообщения: 239
Зарегистрирован: 06 окт 2005, 16:21
Откуда: Dnepropetrovsk

prikolist писал(а):При этом функции возвращают значение определённого типа
которое замещает в вызвавшем выражении,имя вызваной функции.
Это значит, что имя этой функции можно использовать везде, где есть переменная этого типа. Так называемое lvalue, т.е. ему присваивать нельзя. На вторую часть вопроса уже ответили.
Оптимизация по скорости:
#define while if
Оптимизация по размеру:
#define struct union
Rycharg
Сообщения: 28
Зарегистрирован: 15 апр 2009, 14:23
Откуда: SPb

т.е. ему присваивать нельзя.
А как же "левые" функции?
К примеру так:

Код: Выделить всё


int& min(int& a, int& b){return a < b ? a : b;} 
//----------
// Где-то в программе
//----------
int x, y, z;
// Какой-то код
min(x, y) =  z; 

BBB
Сообщения: 1298
Зарегистрирован: 27 дек 2005, 13:37

Rycharg писал(а):А как же "левые" функции?
К примеру так:

Код: Выделить всё

int& min(int& a, int& b){return a < b ? a : b;} 
Эта функция (котолрая в примере) возвращает ... блин, как это по-русски-то называется... :) ... reference, т.е. как бы сам объект. Поэтому и можно писать "слева".

Вообще, с подобным же успехом, я так понимаю, можно вернуть адрес, и тоже ставить слева, вот вроде этого:

Код: Выделить всё

int* min(int& a, int& b){return a < b ? &a : &b;} 
//----------
// Где-то в программе
//----------
int x, y, z;
// Какой-то код
*(min(x, y)) =  z;
Аватара пользователя
Airhand
Сообщения: 239
Зарегистрирован: 06 окт 2005, 16:21
Откуда: Dnepropetrovsk

Rycharg писал(а):А как же "левые" функции?
В твоём примере, функция возвращает ссылку на int, т.е. синоним адреса памяти, которому можно присваивать. Поэтому эта функция не "левая", а очень даже "правая".
Оптимизация по скорости:
#define while if
Оптимизация по размеру:
#define struct union
Rycharg
Сообщения: 28
Зарегистрирован: 15 апр 2009, 14:23
Откуда: SPb

Немного поясню свою мысль.
При этом функции возвращают значение определённого типа
которое замещает в вызвавшем выражении,имя вызваной функции.
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;
}
//------------------------------------------

Аватара пользователя
Airhand
Сообщения: 239
Зарегистрирован: 06 окт 2005, 16:21
Откуда: Dnepropetrovsk

Ты присваиваеш временному объекту, а не lvalue. lvalue (ему) присватвать нельзя. Всё в книге верно.
Оптимизация по скорости:
#define while if
Оптимизация по размеру:
#define struct union
Ответить