Информационный сайт

 

Реклама
bulletinsite.net -> Книги на сайте -> Программисту -> Янг Майкл Дж. -> "Visual С++ 6. Полное руководство: В 2 т.(том1)" -> 33

Visual С++ 6. Полное руководство: В 2 т.(том1) - Янг Майкл Дж.

Янг Майкл Дж. Visual С++ 6. Полное руководство: В 2 т.(том1) — Бином, 2006. — 569 c.
Скачать (прямая ссылка): vicualcc2006t1.djvu
Предыдущая << 1 .. 27 28 29 30 31 32 < 33 > 34 35 36 37 38 39 .. 204 >> Следующая

Кроме того, можно инициализировать константную ссылку, используя константное выражение (вспомните, что нельзя инициализировать ссылку на переменную-неконстанту константным выражением), например:
const int &RCInt =5; // правильная инициализация
В этом определении компилятор создает временную переменную типа const int, содержащую значение 5, а затем инициализирует PCInt как псевдоним этой временной переменной.
Обратите внимание: бессмысленно (хотя и допустимо) объявлять ссылочную переменную константой, поскольку все ссылки автоматически являются константами (вспомните, что после инициализации ссылки ее нельзя сделать ссылкой на другую переменную).
int N;
int Sconst RCInt = N; // разрешено, но бессмысленно
Наконец, нельзя использовать константную переменную для инициализации ссылки на не константный тип данных, потому что это косвенный способ изменения константной переменной.
const int CInt = 1;
int sRInt = Cint; // ошибка
RInt = 5; // Если бы инициализация была допустима, зто
// выражение привело бы к изменению // константной переменной!
Константы и функции
Параметры функции, как и тип возвращаемого ею значения, можно объявить, используя ключевое слово const.
Объявление параметра как константы означает, что функция не может изменить значение этого параметра, что касается лишь деталей реализации функции. Поэтому при вызове на данную особенность можно не обращать внимания.
void FuncA (const int N); // FuncA не может изменить N; ну и что?
Если параметр является указателем или ссылкой, то функция может, как обычно, изменять значение передаваемой переменной.
FuncA (int *PInt); FuncB (int SRInt);
void main () (
int N = 1;
FuncA (SN); // FuncA может изменять значение N FuncB (N) ; // FuncB может изменять значение N
// ...
}
Если же параметр является указателем или ссылкой на тип const, то функция не может изменить значение передаваемой переменной. При вызове функции побочный эффект, вызванный изменением значения переменной, отсутствует. Например:
FuncA (const int *PInt); FuncB (const int SRInt);
void main () {
int N = 1;
FuncA (SN); // FuncA НЕ МОЖЕТ изменить значение N
FuncB (N); // FuncB НЕ МОЖЕТ изменить значение N
// ...
}
Кроме того, если параметр является указателем или ссылкой на тип данных const, то функции можно передать константную переменную. Если же параметр является указателем или ссылкой на неконстантный тип данных, то передача константы запрещается, так как это приводит к возникновению некорректной ситуации (изменению константы). Например, если N объявлена как
const int N = 1;
можно законно передать адрес N в FuncA или передать N в FuncB, как в приведенном выше примере.
Если параметр объявлен как ссылка на константу, то можно передать функции константное выражение (не допустимо для параметра, который является ссылкой на неконстанту).
void FuncA (const int SRInt);
void main ()
(
FuncA (5); // разрешено // . . •
)
Если функция возвращает значение базового типа (например, int или double), добавление ключевого слова const к спецификации возвращаемого значения в определении функции не имеет особого значения, потому что изменить такое возвращаемое значение нельзя никаким способом (т. е. это не адресуемое выражение).
Например:
const int Func (); // Возвращается не адресуемое выражение, // поэтому его никак нельзя изменить
Однако если функция возвращает указатель или ссылку, добавление ключевого слова const означает, что вызывающая функция не может использовать возвращаемое значение для изменения значения переменной, на которую указывает или ссылается функция. Например:
const int *FuncA () {
static int Protected = 1; ++Protected;
return SProtected; }
const int &FuncB ()
(
static int Safe = 100; —Safe;
return Safe;
void main (int Parm)
{
int N;
N = *FuncA О; //разрешено: N принимает копию Protected
N = FuncB {); //разрешено: N принимает копию переменной Safe
*FuncA () =5; //ОШИБКА: попытка изменения значения типа const ++FuncB (); //ОШИБКА: попытка изменения значения типа const
Заметьте, что сами функции FuncA и FuncB изменяют значение внутреннего элемента данных. Так как в их объявлении имеется ключевое слово const, вызывающей функции запрещено производить аналогичные изменения.
Перегруженные функции
В программе на языке С++, можно определить несколько функций с одним и тем же именем, если функции с идентичными именами отличаются по числу и типам параметров. Например, объявление двух различных вариантов функции Abs, один для вычисления абсолютной величины типа int, а другой - для значения типа double, например:
int Abs (int N)
{
return N < 0 ? -N : N; }
double Abs (double N) {
return N < 0.0 ? -N : N;
}
Если такие функции, которые названы идентично, объявлены внутри одной области видимости, то их называют перегруженными функциями. Компилятор автоматически вызывает соответствующий вариант перегруженной функции на основании типа параметра или параметров в фактическом вызове функции, например:
int Abs (int N); // оба варианта функции Abs объявлены в
Предыдущая << 1 .. 27 28 29 30 31 32 < 33 > 34 35 36 37 38 39 .. 204 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100