Бьерн Страуструп - Абстракция данных в языке С++
Страница 10. Аргументы по умолчанию и включаемые функции


 

       Аргументы по умолчанию и включаемые функции

    Класс c o m p l e x включает три конструктора, два из
  которых просто подставляют нулевое значение (по умолчанию ),
  предоставлены программисту для удобства нотации. Использование
  перегрузки типично для конструкторов, но также часто
  обнаруживается и для других функций. Такая перегрузка, однако,
  весьма трудоемкий обходной путь подстановки аргументов по
  умолчанию и, в особенности для более сложных конструкторов,
  крайне избыточнa. Следовательно должна быть предоставлена
  возможность для непосредственного задания аргументов по
  умолчанию. Например:

        class complex {
                    . . .
        public:
              complex(double r=0, double i=0) { re = r; im = i;}
        };
 

    Если завершающий аргумент отсутствует, может быть использовано
  константное выражение по умолчанию. Например :

        complex a(1,2);
        complex b(1); /* b = complex(1, 0); */
        complex c; /* c = complex(0, 0); */

    Если составляющая функция такая, как вышеприведенная функция
  c o m p l e x не только описана, но и определена, (то есть
  приведено ее тело) в описании класса, то при обращении к ней
  может быть выполнена константная подстановка, избегая тем самым
  обычных накладных расходов по вызову функции. Константная
  подстановка функции не является макроподстановкой, семантика
  такой функции идентична семантике других функций. Любая функция
  может быть объявлена включаемой (*1) предшествующим указанием
  ключевого слова i n l i n e . Включаемые функции могут сделать
  описания классов крайне раздутым и они в случае разумного
  использованияа повышают эффективность исполнения, но всегда
  увеличивают время и память, необходимые для компиляции.
  Включаемые функции, таким образом, должны использоваться только в
  случае, если ожидается значительное повышение эффективности
  исполнения. Они были включены в С++ вследствие опыта
  использования макросов в С. В некоторых приложениях макросы
  бывают необходимы (и нет возможности определить макрос в составе класса)
  но значительно чаще они создают хаос тем, что выглядят
  как функции, но не подчиняются ни синтаксису функций, ни правилам
  видимости, ни правилам передачи аргументов.

 
« Предыдущая статья   Следующая статья »