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

5.6Статические функции класса

Как в языке C++/CLI, так и в языках C# и Java, можно описать в классе статические данные или функции, поставив перед ними ключевое слово static.

Статические данные становятся глобальными данными, а статические функции - глобальными функциями. С точки зрения надёжности программ желательно не создавать глобальные данные и функции, и делать это лишь в исключительных случаях. Желательно иметь дело только с интерфейсными функциями объекта, инкапсулировав в объектах всё, что возможно. Но, тем не менее, иногда появляется необходимость в глобальных данных и функциях. Например, глобальные функции Main() и main() программы объявлены как статические, поскольку они должны вызываться операционной системой. Как статические объявлены и функции Write() и WriteLine(), print() и printin() консольного ввода/вывода.

Особенностью статических функций является то, что они:

  • не должны использовать нестатические данные и функции, то есть они могут использовать только данные и функции, помеченные словом static;

  • статическая функция вызывается посредством ссылки через класс, в котором она описана, например:

Console::WriteLine (" Статическая ф-я класса Console "); // C++/CLI

Console.WrlteLine (" Статическая ф-я класса Console "); // C#

System.out.println (" Статическая ф-я класса out"); // Java

  • статическая функция может вызывать только статические функции класса, к которому она принадлежит; то есть она не может вызвать обычные функции её класса.

Пример 5.6.1. Статические функции.

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

// C++/CLI

#include "stdafx.h"

using namespace System; // Использовать пространство имён System

static void Fm() {Console::WriteLine("Fm()");} // Статическая функция

class CA // Описание класса с функциями

{

public:

Void f() {Console::WriteLine("f()");} // Обычная функция

static void Fs() {Console::WriteLine ("Fs()");} // Статическая ф-я

};

Int main() // Главная статическая функция Main()

{

CA ca; // Объект ca класса CA

ca.F(); // Вызвать обычную функцию F() класса СA

CA::Fs(); // Вызвать статическую функцию Fs() класса CA

//Fs(); // Ошибка: Undeclared identifier

Fm(); // Вызвать глобальную статическую функцию Fm()

}

Результат:

F()

Fs()

Fm()

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

/ / C#

class CA // Описание класса с функциями

{

public void F() {Console.WriteLine (" F ()");} // Обычная функция

public static void Fs() {Console.WriteLine (" Fs ()");} // Статическая ф-я

}

class Program

{

static void Fm() { Console.WriteLine(" Fm ()"); } // Статическая ф-я

static void Main(string[] args)

{

CA ca= new CA ( ) ; // Создать объект ca класса CA

ca.F(); // Вызвать обычную функцию F() класса CA

CA.Fs(); // Вызвать статическую функцию Fs() класса CA

//Fs (); // Вызвать статическую функцию Fs() класса CA

// Ошибка: The name 'Fs' does not exist in the class or namespace

Program.Fm(); // Вызвать статическую Fm() функцию класса

}

}

Результат:

F ( )

Fs ( )

Fm()

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

// Java и J#

class CA

{

// Описание класса с функциями

public void F() {System.out.println (" F ()");} // Обычная функция

public static void Fs() {System.out.println(" Fs ( )");}//Статическая ф-я

}

public class Test

{

static void Fm() {System.out.println(" Fm ()");} // Статическая ф-я

public static void main(String[] args)

{

CA ca= new CA (); // Создать объект ca класса CA

ca.F(); // Вызвать обычную функцию F() класса CA

CA.Fs(); // Вызвать статическую функцию Fs() класса CA

//Fs (); // Вызвать статическую функцию Fs() класса CA

// Ошибка: Cannot find method 'Fs()' in 'c)Example_4_6_l'

Test.Fm(); // Вызвать статическую Fm() функцию класса

}

}

Результат:

F ()

Fs ( )

Fm ()

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