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

Void Show ( ) // Открытая функция

{

System.out.print ("x= " + x);

System.out.println (" y= " + y);

}

}

public class Test

{

public static void main(String[] args)

{

A sObjA= new A(); // Объект класса А в управляемой куче

sObjA.Set(2,'w');

sObjA.Show();

sObjA.y= 'b';

sObjA.Show();

}

}

Результат:

x= 2 y= w

x= 2 y= b

*/

Поясним эту простую программу.

C++/CLI. В начале тела главной функции main() описан класс А, содержащий целочисленную закрьггую переменную x и открытые символьную переменную у и функции Set() и Show(). Переменная x доступна функциям Set() и Show() только внутри объекта, а переменная у, открьггые функции Set() и Show() могут использоваться и вне объекта. Объявление А objA размещает объект objA в стеке. Затем функция objA.Set(l,'z') устанавливает значение х, равным 1, и значение у, равным 'z', а функция objA.Show() выводит эти значения на экран.

В строке А *pObjA =new А; оператор new создаёт объект класса А в неуправляемой куче и присваивает его адрес указателю pObjA типа А. Затем pObjA->Set(2,'w'); устанавливает значение x, равным 2, и значение у, равным 'w', а pObjA->Show(); выводит эти значения на консоль. Строка pObjA->y='b'; присваивает открытой переменной у значение 'b'. Оператор delete pObjA; удаляет память, выделенную ранее объекту оператором new в неуправляемой куче.

Присвоение значения закрытой переменной x посредством objA.x=l; и pObjA->x=2; было бы ошибочно, так как переменная x недоступна вне объекта objA и объекта, созданного оператором new.

При определении класса на языке C++/CLI через ключевое слово class его данные и функции по умолчанию считаются закрьггыми (private). Но в языке C++/CLI можно также описать классы с помощью ключевых слов struct и union. Если класс описан с помощью ключевого слова struct, то его данные и функции по умолчанию считаются открьгтыми (public), и их можно закрыть с помощью private. При использовании union данные и функции класса могут быть только открытыми.

C#. Как видно из примера 5.1.1, структура С#-программы отличается от структуры С++-программы. Программа на C# представляет пространство имён, включающее описание классов и структур. В нашем примере за ненадобностью пространство имён опущено. Компилятор всегда вставляет пространство имён, но мы для простоты программы удалили его и в дальнейшем будем оставлять только при необходимости. В нашем примере в опущенном пространстве имён описаны класс А и класс Program, содержащий главную функцию Main() программы. Ранее уже говорилось, что язык C# не разрешает описывать в программе функции вне класса как в языке C++/CLI. То есть пространство имён языка C# не содержит описания функций. Описание класса не завершается точкой с запятой ";" как в языке C++/CLI.

Взглянем на тело функции Main(). Поскольку в языке C# тип class относится к управляемым типам, то объекты класса должны размещаться в управляемой куче с помощью оператора new.

Вместо запрещённых указателей язык C# использует переменные ссылочного типа, значения которых инициализируются оператором new и используются сборщиком мусора. У нас это переменная sObjA. Здесь это не указатель, как в C++/CLI! Переменная ссылочного типа использует оператор "." (точка) при ссылке к открытым данным или функциям класса, а не оператор "->" (стрелка).

Исчезла необходимость в применении оператора delete, поскольку удаление объектов в управляемой куче осуществляется сборщиком мусора. По умолчанию данные и функции в классе закрыты и для их открытия надлежит воспользоваться доступом public. В примере 5.1.1 перед объявлением закрытой переменной x не стоит ключевое слово доступа, по умолчанию оно является словом private.

Java. Из примера 5.1.1 видно, что Java-nporpaммa отличается от C# программы незначительно. Отличаются функции вывода на консоль, заголовок главной функции main() и, обратите внимание, перед объявлением закрытой переменной x появился доступ private. В отличие от языков C++/CLI и C# данные и функции клacca языкa Java по умолчанию открыты.

5.2Подставляемые функции и оператор привязки языка C++/CLI

C++/CLI. Функции языка C++/CLI, описанные внутри класса, называются подставляемьши функциями (inline functions). В местах вызова этих функций вставляется их тело. Это обеспечивает эффективное выполнение этих функций. Так как в местах вызова обычных функций компилятор вставляет только операторы вызова, а в случае подставляемых функций - код их тела, то при использовании подставляемых функций тратится значительная память (возрастает размер программы). Подставляемые функции должны быть очень простыми, в них не допускается использование сложных операторов.

Описанные в классе А примера 5.1.1 функции Set() и Show() являются подставляемыми функциями. Обычно функции класса (не подставляемые функции) только объявляют внутри класса, а описывают вне класса, привязывая их к классу с помощью специального оператора привязки.

Оператор привязки "::" или оператор разрешения области видимости "::" (scope access operator) указывает, какому классу принадлежит функция. Оператор привязки помещается в описании функции между типом возвращаемого значения и именем функции. Перед оператором привязки ставится имя класса. Описание функции класса вне класса приведено в примере 5.2.1.