Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Медведев_С++_CLI_C#_Java_J#.doc
Скачиваний:
3
Добавлен:
01.07.2025
Размер:
5 Мб
Скачать
☆

Пример 5.2.1. Описание функций вне класса.

////////////////////

// C++/CLI

class А // Объявление класса А

{

private:

Int X; //Закрытая переменная х

public:

char у; // Открытая переменная

Void Set(int m,char n); // 0бъявление функции Set

Void Show (); // Объявление функции Show()

};

void A::Set(int m, char n) {x= m; y= n;} // Описание функции Set()

В теле класса А примера 5.2.1 функции Set() и ShowO только объявлены, поэтому их описания должно быть размещены вне класса с использованием оператора привязки А::. В примере дано описание функции Set() вне класса. Чтобы превратить эту функцию в подставляемую функцию, достаточно поместить ключевое слово inline перед void.

C# и Java. В языках C# и Java понятие подставляемых функций отсутствует. Все функции должны описываться внутри класса.

5.3Некоторые замечания о классах

C++/CLI. Описание класса:

class имя_класса

{

члены_класса (данные и функции)

};

Описание класса начинается с заголовка класса, состоящего из ключевого слова class, за которым следует имя класса. Затем помещается тело класса, заключённое в фигурные скобки и заканчивающееся точкой с запятой. В отличие от языков C# и Java в классах языка C++/CLI не разрешается инициализация данных.

class А

{

int x= 0; // Инициализировать нельзя !

};

В языке C++/CLI инициализация данных класса осуществляется специальной функцией конструктор, которую мы рассмотрим позже.

Функции класса имеют область видимости класса, а не файла. То есть они могут быть использованы внутри класса объекта или вне объекта (если они открыты), но применительно к объекту класса, в котором они объявлены.

Функция класса, кроме области видимости класса, имеет свою локальную область видимости. Если идентификатор переменной функции совпадает с идентификатором переменной класса, то для ликвидации двусмысленности надо использовать оператор разрешения области видимости (оператор привязки):

void А::Set (int x, char у) { А::x= x; А::y= у;}

Здесь A::x указывает на закрытую переменную x класса А, а x - на параметр x функции Set().

Нижеследующая программа примера 5.3.1 иллюстрирует использование областей видимости файла, локальных областей видимости и области видимости класса.

Пример 5.3.1. Области видимости.

////////////////////

// C++/CLI

#include "stdafx.h"

int k=1; // Переменная к видна в файле, в классе А, в функциях Get() и main()

Int GetK() {return k;} // Функция GetK() видна в файле, классе а и в

// функции main()

class A // Класс А виден в файле и в функции main()

{

Int n; // Переменная n закрыта и видна только в классе а

public:

void SetM (int n) {A::n= n+k + GetK ();}// Функция SetM() открыта и видна

// применительно к объекту класса А

Int GetM () {return n;} // Функция GetM() открыта и видна

// применительно к объекту класса А

};

int main(array<System::String ^> ^args) // Функция main видна в файле

{

A objA; // Объект objA виден внутри тела функции main()

objA.SetM(4); // Открытая функция объекта objA применима к нему

System::Console::WriteLine ("GetK ()+k= {0} n= {1}",

(GetK()+k).ToString(), (objA.GetM()).ToString());

}

Результат:

GetK ()+k= 2 n= 6

C# и Java. В языках C# и Java область видимости функции определяется областью видимости класса, которому она принадлежит. То есть функция может использовать данные и функции класса, а также статические функции классов доступных пространств имён. Ссылка к открытым функциям других классов осуществляется посредством ссылок к их объектам или ссылки к классу статических функций. В отличие от языка C++/CLI в языке C# запрещено использование переменных с одним и тем же именем в охватываемом и охватывающем блоках. Имена параметров функции должны отличаться от имён других переменных в теле функции.

О статических функциях и их использовании будет изложено в разделе 5.6.