Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«QT 4: ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ GUI Π½Π° Π‘++Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 120

Автор Жасмин Π‘Π»Π°Π½ΡˆΠ΅Ρ‚

int i = 5;

int j = 10;

i = j;

β€’ Π’ΠΈΠΏΡ‹ ссылок. Π­Ρ‚ΠΎ Ρ‚Π°ΠΊΠΈΠ΅ классы, ΠΊΠ°ΠΊ Integer (Π² Java), String ΠΈ MyVeryOwnClass. Π˜Ρ… экзСмпляры ΡΠΎΠ·Π΄Π°ΡŽΡ‚ΡΡ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° new. ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ присваивания ΠΊΠΎΠΏΠΈΡ€ΡƒΠ΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ссылку Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, Π° для Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ копирования ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ clone() (Π² Java) ΠΈΠ»ΠΈ Clone() (Π² C#). НапримСр:

Integer i = new Integer(5);

Integer j = new Integer(10);

i = j.clone();

Π’ Π‘++ всС Ρ‚ΠΈΠΏΡ‹ ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΊΠ°ΠΊ Β«Ρ‚ΠΈΠΏΡ‹ ссылок», Π° Π² Π΄ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΊ этому Ρ‚Π΅ ΠΈΠ· Π½ΠΈΡ…, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΄ΠΎΠΏΡƒΡΠΊΠ°ΡŽΡ‚ ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅, ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΊΠ°ΠΊ Β«Ρ‚ΠΈΠΏΡ‹ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉΒ». НапримСр, Π² Π‘++ Π½Π΅Ρ‚ нСобходимости ΠΈΠΌΠ΅Ρ‚ΡŒ класс, ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹ΠΉ Integer, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ new:

int *i = new int(5);

int *j = new int(10);

*i = *j;

Π’ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ Java ΠΈ C#, Π² Π‘++ опрСдСляСмыС ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ Ρ‚ΠΈΠΏΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Ρ‚Π°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ встроСнныС Ρ‚ΠΈΠΏΡ‹:

Point2D *i = new Point2D(5, 5);

Point2D *j = new Point2D(10, 10);

*i = *j;

Если трСбуСтся ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ класс Π‘++ ΠΊΠΎΠΏΠΈΡ€ΡƒΠ΅ΠΌΡ‹ΠΌ, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΡ€Π΅Π΄ΡƒΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Π² этом классС конструктор копирования ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ присваивания. ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ‚ΠΎΡ€ копирования вызываСтся ΠΏΡ€ΠΈ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Π΄Ρ€ΡƒΠ³ΠΈΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅ Ρ‚ΠΈΠΏΠ°. БинтаксичСски Π² Π‘++ это обСспСчиваСтся двумя способами:

Point2D i(20, 20);

Point2D j(i); // ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ способ

Point2D k = i; // Π²Ρ‚ΠΎΡ€ΠΎΠΉ способ

ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ присваивания вызываСтся ΠΏΡ€ΠΈ присваивании ΠΎΠ΄Π½ΠΎΠΉ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ:

Point2D i(5, 5);

Point2D j(10, 10);

j = i;

ΠŸΡ€ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ класса компилятор Π‘++ автоматичСски обСспСчиваСт конструктор копирования ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ присваивания, Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‰ΠΈΠ΅ ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‡Π»Π΅Π½Π° Π² Ρ‡Π»Π΅Π½. Для класса Point2D это Ρ€Π°Π²Π½ΠΎΡΠΈΠ»ΡŒΠ½ΠΎ Ρ‚ΠΎΠΌΡƒ, ΠΊΠ°ΠΊ Ссли Π±Ρ‹ ΠΌΡ‹ написали ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ ΠΊΠΎΠ΄ Π² ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ класса:

01 class Point2D

02 {

03 public:

04 Point2D(const Point2D &other)

05 : xVal(other.xVal), yVal(other.yVal) { }

06 Point2D &operator=(const Point2D &other)

07 {

08 xVal = other.xVal;

09 yVal = other.yVal;

10 return *this;

11 }

12 …

13 private:

14 double xVal;

15 double yVal;

16 };

Для Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… классов создаваСмыС ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ конструктор копирования ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ присваивания ΠΎΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ нСподходящими. ΠžΠ±Ρ‹Ρ‡Π½ΠΎ это происходит Π² Ρ‚Π΅Ρ… случаях, ΠΊΠΎΠ³Π΄Π° класс ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Π΄ΠΈΠ½Π°ΠΌΠΈΡ‡Π΅ΡΠΊΡƒΡŽ ΠΏΠ°ΠΌΡΡ‚ΡŒ. Π§Ρ‚ΠΎΠ±Ρ‹ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ класс ΠΊΠΎΠΏΠΈΡ€ΡƒΠ΅ΠΌΡ‹ΠΌ, ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ сами Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ конструктор копирования ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ присваивания.

Для классов, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ ΠΊΠΎΠΏΠΈΡ€ΡƒΠ΅ΠΌΡ‹ΠΌΠΈ, ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡ‚ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ конструктор копирования ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ присваивания, Ссли ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΠΈΡ… Π·Π°ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΌΠΈ. Если ΠΌΡ‹ случайно попытаСмся ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ экзСмпляры Ρ‚Π°ΠΊΠΎΠ³ΠΎ класса, компилятор выдаст сообщСниС ΠΎΠ± ошибкС. НапримСр:

class BankAccount

{

public:

…

private:

BankAccount(const BankAccount &other);

BankAccount &operator=(const BankAccount &other);

};

Π’ Qt ΠΌΠ½ΠΎΠ³ΠΈΠ΅ классы ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Π»ΠΈΡΡŒ ΠΊΠ°ΠΊ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Π΅ ΠΏΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ. Они ΠΈΠΌΠ΅ΡŽΡ‚ конструктор копирования ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ присваивания ΠΈ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΈΠ½ΡΡ‚Π°Π½Ρ†ΠΈΡ€ΡƒΡŽΡ‚ΡΡ Π² стСкС Π±Π΅Π· использования ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° new. Π­Ρ‚ΠΎ относится ΠΊ классам QDateTime, QImage, QString ΠΈ ΠΊ классам—контСйнСрам, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ QList<T>, QVector<T> ΠΈ QMap<K, T>.

Π”Ρ€ΡƒΠ³ΠΈΠ΅ классы ΠΏΠΎΠΏΠ°Π΄Π°ΡŽΡ‚ Π² ΠΊΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΡŽ Β«Ρ‚ΠΈΠΏΠ° ссылок», Π² частности QObject ΠΈ Π΅Π³ΠΎ подклассы (QWidget, QTimer, QTcpSocket ΠΈ Ρ‚.Π΄.). Они ΠΈΠΌΠ΅ΡŽΡ‚ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈ Π½Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ. НапримСр, QWidget прСдставляСт ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠ΅ ΠΎΠΊΠ½ΠΎ ΠΈΠ»ΠΈ элСмСнт управлСния Π½Π° экранС дисплСя. Если Π² памяти находится 75 экзСмпляров QWidget, Π½Π° экранС Ρ‚Π°ΠΊΠΆΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ 75 ΠΎΠΊΠΎΠ½ ΠΈΠ»ΠΈ элСмСнтов управлСния. ΠžΠ±Ρ‹Ρ‡Π½ΠΎ эти классы ΠΈΠ½ΡΡ‚Π°Π½Ρ†ΠΈΡ€ΡƒΡŽΡ‚ΡΡ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° new.

Π“Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ

Π‘++ позволяСт ΠΎΠ±ΡŠΡΠ²Π»ΡΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠ°Ρ‚ Π½ΠΈΠΊΠ°ΠΊΠΎΠΌΡƒ классу ΠΈ ΠΊ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ±Ρ€Π°Ρ‰Π°Ρ‚ΡŒΡΡ ΠΈΠ· любой Π΄Ρ€ΡƒΠ³ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. ΠœΡ‹ Π²ΠΈΠ΄Π΅Π»ΠΈ нСсколько ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ² Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, Π² частности main() β€” Ρ‚ΠΎΡ‡ΠΊΠ° Π²Ρ…ΠΎΠ΄Π° Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ. Π“Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ Π²ΡΡ‚Ρ€Π΅Ρ‡Π°ΡŽΡ‚ΡΡ Ρ€Π΅ΠΆΠ΅, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΈ ΠΏΠ»ΠΎΡ…ΠΎ Π²Π»ΠΈΡΡŽΡ‚ Π½Π° ΠΌΠΎΠ΄ΡƒΠ»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΈ Ρ€Π΅Π΅Π½Ρ‚Π΅Ρ€Π°Π±Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ. ВсС ΠΆΠ΅ Π²Π°ΠΆΠ½ΠΎ ΠΈΠΌΠ΅Ρ‚ΡŒ прСдставлСниС ΠΎ Π½ΠΈΡ…, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π²Π°ΠΌ, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, придСтся с Π½ΠΈΠΌΠΈ ΡΡ‚ΠΎΠ»ΠΊΠ½ΡƒΡ‚ΡŒΡΡ Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠΌ ΠΊΠΎΠ΄Π΅, написанном программистом, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ€Π°Π½ΡŒΡˆΠ΅ писал Π½Π° Π‘, ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡΠΌΠΈ Π‘++.

Для ΠΈΠ»Π»ΡŽΡΡ‚Ρ€Π°Ρ†ΠΈΠΈ Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… рассмотрим Π½Π΅Π±ΠΎΠ»ΡŒΡˆΡƒΡŽ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ, которая ΠΏΠ΅Ρ‡Π°Ρ‚Π°Π΅Ρ‚ список ΠΈΠ· 128 псСвдослучайных чисСл, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΏΡ€ΠΈΠ΄ΡƒΠΌΠ°Π½Π½Ρ‹ΠΉ Π½Π° ΡΠΊΠΎΡ€ΡƒΡŽ Ρ€ΡƒΠΊΡƒ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ. Π˜ΡΡ…ΠΎΠ΄Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ находится Π² Π΄Π²ΡƒΡ… Ρ„Π°ΠΉΠ»Π°Ρ… .cpp.

ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ исходный Ρ„Π°ΠΉΠ» β€” random.cpp:

01 int randomNumbers[128];

02 static int seed = 42;

03 static int nextRandomNumber()

04 {

05 seed = 1009 + (seed * 2011);

06 return seed;

07 }

08 void populateRandomArray()

09 {

10 for (int i = 0; i < 128; ++i)

11 randomNumbers[i] = nextRandomNumber();

12 }

Π’ этом Ρ„Π°ΠΉΠ»Π΅ ΠΎΠ±ΡŠΡΠ²Π»ΡΡŽΡ‚ΡΡ Π΄Π²Π΅ Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ (randomNumbers ΠΈ seed) ΠΈ Π΄Π²Π΅ Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ (nextRandomNumber() ΠΈ populateRandomArray()). Π’ Π΄Π²ΡƒΡ… ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½ΠΈΡΡ… ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово static; эти объявлСния Π²ΠΈΠ΄ΠΈΠΌΡ‹ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π²Π½ΡƒΡ‚Ρ€ΠΈ Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ Π΅Π΄ΠΈΠ½ΠΈΡ†Ρ‹ компиляции (random.cpp), ΠΈ говорят, Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΈ статичСски связаны (static linkage). Π”Π²Π° Π΄Ρ€ΡƒΠ³ΠΈΡ… объявлСния доступны ΠΈΠ· любой Π΅Π΄ΠΈΠ½ΠΈΡ†Ρ‹ компиляции ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, ΠΎΠ½ΠΈ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°ΡŽΡ‚ внСшнюю связь (external linkage).

БтатичСская ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΊΠ° идСально ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚ для Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΈ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΡ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π² Π΄Ρ€ΡƒΠ³ΠΈΡ… Π΅Π΄ΠΈΠ½ΠΈΡ†Π°Ρ… компиляции. Она сниТаСт риск «столкновСния» ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠ² (наличия Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹Ρ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… с ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹ΠΌ ΠΈΠΌΠ΅Π½Π΅ΠΌ ΠΈΠ»ΠΈ Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ с ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎΠΉ сигнатурой Π² Ρ€Π°Π·Π½Ρ‹Ρ… Π΅Π΄ΠΈΠ½ΠΈΡ†Π°Ρ… компиляции) ΠΈ Π½Π΅ позволяСт Π·Π»ΠΎΠ½Π°ΠΌΠ΅Ρ€Π΅Π½Π½Ρ‹ΠΌ ΠΈΠ»ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠΌ ΠΎΠΏΡ€ΠΎΠΌΠ΅Ρ‚Ρ‡ΠΈΠ²Ρ‹ΠΌ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡΠΌ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ доступ ΠΊ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌ Π΅Π΄ΠΈΠ½ΠΈΡ†Ρ‹ компиляции.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ рассмотрим Π²Ρ‚ΠΎΡ€ΠΎΠΉ Ρ„Π°ΠΉΠ» main.cpp, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π΄Π²Π΅ Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅, ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½Π½Ρ‹Π΅ Π² random.cpp с обСспСчСниСм внСшнСй связи:

01 #include <iostream>

02 using namespace std;

03 extern int randomNumbers[128];

04 void populateRandomArray();

05 int main()

06 {

07 populateRandomArray();

08 for (int i = 0; i < 128; ++i)

09 cout << randomNumbers[i] << endl;

10 return 0;

11 }

ΠœΡ‹ объявляСм внСшниС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π΄ΠΎ ΠΈΡ… Π²Ρ‹Π·ΠΎΠ²Π°. ОбъявлСниС randomNumbers внСшнСй ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ (Ρ‡Ρ‚ΠΎ Π΄Π΅Π»Π°Π΅Ρ‚ Π΅Π΅ Π²ΠΈΠ΄ΠΈΠΌΠΎΠΉ Π² Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ Π΅Π΄ΠΈΠ½ΠΈΡ†Π΅ компиляции) начинаСтся с ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ³ΠΎ слова extern. Если Π±Ρ‹ Π½Π΅ Π±Ρ‹Π»ΠΎ этого ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ³ΠΎ слова, компилятор «посчитал» Π±Ρ‹, Ρ‡Ρ‚ΠΎ ΠΎΠ½ ΠΈΠΌΠ΅Π΅Ρ‚ Π΄Π΅Π»ΠΎ с ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ΠΌ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ, ΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²Ρ‰ΠΈΠΊ «поТаловался» Π±Ρ‹ Π½Π° ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΎΠ΄Π½ΠΎΠΉ ΠΈ Ρ‚ΠΎΠΉ ΠΆΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Π² Π΄Π²ΡƒΡ… Π΅Π΄ΠΈΠ½ΠΈΡ†Π°Ρ… компиляции (random.cpp ΠΈ main.cpp). ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΎΠ±ΡŠΡΠ²Π»ΡΡ‚ΡŒΡΡ любоС количСство Ρ€Π°Π·, ΠΎΠ΄Π½Π°ΠΊΠΎ ΠΎΠ½ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄Π½ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅. ИмСнно благодаря ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΡŽ компилятор Ρ€Π΅Π·Π΅Ρ€Π²ΠΈΡ€ΡƒΠ΅Ρ‚ пространство для ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ.

Ѐункция populateRandomArray() ΠΎΠ±ΡŠΡΠ²Π»ΡΠ΅Ρ‚ΡΡ с использованиСм ΠΏΡ€ΠΎΡ‚ΠΎΡ‚ΠΈΠΏΠ°. Π£ΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово extern для Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π½Π΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ.

ΠžΠ±Ρ‹Ρ‡Π½ΠΎ объявлСния Π²Π½Π΅ΡˆΠ½ΠΈΡ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΏΠΎΠΌΠ΅Ρ‰Π°ΡŽΡ‚ Π² Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» ΠΈ Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‚ Π΅Π³ΠΎ Π²ΠΎ всС Ρ„Π°ΠΉΠ»Ρ‹, Π³Π΄Π΅ ΠΎΠ½ΠΈ Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ΡΡ:

01 #ifndef RANDOM_H

02 #define RANDOM_H

03 extern int randomNumbers[128];

04 void populateRandomArray();

05 #endif

ΠœΡ‹ ΡƒΠΆΠ΅ Π²ΠΈΠ΄Π΅Π»ΠΈ, ΠΊΠ°ΠΊ ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово static ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ для объявлСния ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…β€”Ρ‡Π»Π΅Π½ΠΎΠ² ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉβ€”Ρ‡Π»Π΅Π½ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ ΠΏΡ€ΠΈΠ²ΡΠ·Ρ‹Π²Π°ΡŽΡ‚ΡΡ ΠΊ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΌΡƒ экзСмпляру класса, ΠΈ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΡ‹ ΡƒΠ²ΠΈΠ΄Π΅Π»ΠΈ, ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ Π΅Π³ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для объявлСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… со статичСской связью. БущСствуСт Π΅Ρ‰Π΅ ΠΎΠ΄Π½ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ³ΠΎ слова static, ΠΎ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ слСдуСт ΡƒΠΏΠΎΠΌΡΠ½ΡƒΡ‚ΡŒ. Π’ Π‘++ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Π»ΠΎΠΊΠ°Π»ΡŒΠ½ΡƒΡŽ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ ΠΊΠ°ΠΊ ΡΡ‚Π°Ρ‚ΠΈΡ‡Π΅ΡΠΊΡƒΡŽ. Π’Π°ΠΊΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‚ΡΡ ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π²ΠΎΠΌ Π²Ρ‹Π·ΠΎΠ²Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈ ΡΠΎΡ…Ρ€Π°Π½ΡΡŽΡ‚ свои значСния ΠΌΠ΅ΠΆΠ΄Ρƒ Π²Ρ‹Π·ΠΎΠ²Π°ΠΌΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ. НапримСр:

01 void nextPrime()

02 {

03 static int n = 1;

04 do {

05 ++n;

06 } while (!isPrime(n));

07 return n;

08 }

БтатичСскиС Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹ Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹ΠΌ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ, Π·Π° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΈ Π²ΠΈΠ΄ΠΈΠΌΡ‹ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π²Π½ΡƒΡ‚Ρ€ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΎΠ½ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹.

ΠŸΡ€ΠΎΡΡ‚Ρ€Π°Π½ΡΡ‚Π²Π° ΠΈΠΌΠ΅Π½

ΠŸΡ€ΠΎΡΡ‚Ρ€Π°Π½ΡΡ‚Π²Π° ΠΈΠΌΠ΅Π½ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ ΡΠ½ΠΈΠ·ΠΈΡ‚ΡŒ риск ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚Π° ΠΈΠΌΠ΅Π½ Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°Ρ… Π‘++. ΠšΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚Ρ‹ ΠΈΠΌΠ΅Π½ часто Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡŽΡ‚ Π² Π±ΠΎΠ»ΡŒΡˆΠΈΡ… ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°Ρ…, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΡ… нСсколько Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ нСзависимых Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ². Π’ своСй собствСнной ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ Π²Ρ‹ Ρ€Π΅ΡˆΠ°Π΅Ρ‚Π΅ сами, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π»ΠΈ Π²Π°ΠΌ ΠΈΠ»ΠΈ Π½Π΅Ρ‚ пространства ΠΈΠΌΠ΅Π½.