Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Язык программирования Сpp 25.09.11 (2).doc
Скачиваний:
16
Добавлен:
19.08.2019
Размер:
10.09 Mб
Скачать

Int local_var; /* по умолчанию auto */

static int *local_ptr=&local_var; /* так неправильно */

static int *global_ptr=&global_var; /* а так правильно */

register int *reg_ptr=&local_var; /* и так правильно */ }

В приведенном примере глобальная переменная global_var имеет глобальное время жизни и постоянный адрес в памяти, и этот адрес можно использовать для инициализации статического указателя global_ptr. Локальная переменная local_var, имеющая класс памяти auto размещается в памяти только на время работы функции func, адрес этой переменной не является константой и не может быть использован для инициализации статической переменной local_ptr. Для инициализации локальной регистровой переменной reg_ptr можно использовать неконстантные выражения, и, в частности, адрес переменной local_ptr.

2.4. Перегрузка

В любом языке, в данном случае мы имеем в виду обычный язык общения, – русский, английский, и т.п., есть слова, перегруженные смысловым значением. Например, слово лук может обозначать растение, а может вид оружия. Особенно много перегруженных слов в технике. Примером тому могут быть слова: фаза, схема, цикл. Да и само слово перегрузка перегружено. Оно может означать избыточный вес или перемещение груза и даже перезапуск компьютера. Особенно богат, в этом отношении, английский язык. Возможно поэтому разработчики С++, родной язык у которых именно английский, сделали перегружаемыми имена функций. Это, конечно, шутка, но перегрузка имен функций действительно существует и весьма активно используется при программировании.

С++ позволяет создавать несколько различных функций с одними и тем же именем. Например, можно пользоваться одним и тем же именем middle для трех функций, предназначенных для определения среднего значения двух чисел, трех и четырех чисел. Определение двух и более функций с одинаковым именем называется перегрузкой.

В связи с эти рассмотрим упомянутый пример.

//вычисление среднего

#include <iostream>

using namespace std;

// Описание прототипов

double middle(double, double);

double middle(double, double, double);

double middle(double, double, double, double);

//------------------------------------------------------

void main(){

int number;

double x1,x2,x3,x4,mid;

for(int i=1; i<5; i++){ //5 раз высчитаем среднее

cout << "\n\n number="; //Сколько чисел будет введено

cin >> number;

switch (number){

case 2: cin >>x1>>x2;

mid=middle(x1,x2); break;

case 3: cin >>x1>>x2>>x3;

mid=middle(x1,x2,x3); break;

case 4: cin >>x1>>x2>>x3>>x4;

mid=middle(x1,x2,x3,x4); break;

default: cout << "\nThe program is over";

} // конец switch

cout <<"middle=" <<mid;

} // конец цикла

}// конец main

// Описание функций

double middle(double x, double y){

return (x+y)/2;

}

double middle(double x, double y, double z){

return (x+y+z)/3;

}

double middle(double x, double y, double z, double u){

return (x+y+z+u)/4;

}

Удивительно, но программа находит именно ту функцию, которая требуется для расчета среднего значения. Вы, конечно, заметили, что на самом деле эти функции различаются количеством аргументов. Программа, естественно, различает их по тому же признаку. Но если даже количество аргументов одинаково, но последовательность типов разная, то программа тоже их различит, так следующие функции будут считаться разными.

fun (int x, int y);

fun (double x, int y);

fun (int x, double y);

fun (double x, double y);

Перегрузка функций на самом деле является частью более сложного понятия, которое имеет название полиморфизм. В данном случае полиморфизм, - это использование одного и того же имени для обозначения различных объектов. Полиморфизм это один из 3-х китов на которых держится язык С++, но об этом мы будем говорить подробнее несколько позже.