fp2 = space; // получаем адрес функции space(int, char)
fp1(22); // Выводим 22 пробела (этот вызов аналогичен вызову (* fp1) (22)) .
cout << "|\n";
fp2(30, 'х'); // Выводим 30 символов "х" (этот вызов аналогичен вызову (*fp2) (30, 'x').
cout << "|\n";
return 0;
}
Вот как выглядят результаты выполнения этой программы.
I
ХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХ I
Как отмечено в комментариях, компилятор способен определить, адрес какой перегруженной функции он получает, на основе того, как объявлены указатели
Итак, когда адрес перегруженной функции присваивается указателю на функцию, то именно это объявление указателя служит основой для определения того, адрес какой функции был присвоен. При этом объявление указателя на функцию должно соответствовать одной (и только одной) из перегруженных функций. В противном случае в программу вносится неоднозначность, которая вызовет ошибку компиляции.
Ключевое слово
При объявлении статического члена данных в классе программист не должен его определять. Необходимо обеспечить его глобальное определение вне этого класса. Это реализуется путем повторного объявления этой статической переменной с помощью оператора разрешения области видимости, который позволяет идентифицировать, к какому классу она принадлежит. Только в этом случае для этой статической переменной будет выделена память.
Рассмотрим пример использования
#include
using namespace std;
class ShareVar {
static int num;
public:
void setnum(int i) { num = i; };
void shownum() { cout << num << " "; }
};
int ShareVar::num; // определяем static-член num
int main()
{
ShareVar a, b;
a.shownum(); // выводится 0
b.shownum(); // выводится 0
a.setnum(10); // устанавливаем static-член num равным 10
a.shownum(); // выводится 10
b.shownum(); // также выводится 10
return 0;
}
Обратите внимание на то, что статический целочисленный член
Узелок на память.
Если
class ShareVar {
public:
static int num;
void setnum(int i) { num = i; };
void shownum() { cout << num << " "; }
};
В данной версии переменная