HTML Diff
0 added 0 removed
Original 2026-01-01
Modified 2026-03-10
1 <ul><li><a>Определение</a></li>
1 <ul><li><a>Определение</a></li>
2 <li><a>Когда использовать процедуру</a></li>
2 <li><a>Когда использовать процедуру</a></li>
3 <li><a>Синтаксис</a></li>
3 <li><a>Синтаксис</a></li>
4 <li><a>Что нельзя перегружать</a></li>
4 <li><a>Что нельзя перегружать</a></li>
5 <li><a>Способы реализации</a><ul><li><a>Реализация через функцию</a></li>
5 <li><a>Способы реализации</a><ul><li><a>Реализация через функцию</a></li>
6 <li><a>Реализация через дружественные функции</a></li>
6 <li><a>Реализация через дружественные функции</a></li>
7 <li><a>Через методы класса</a></li>
7 <li><a>Через методы класса</a></li>
8 </ul></li>
8 </ul></li>
9 <li><a>Что можно перегрузить - особенности процесса</a><ul><li><a>Operator =</a></li>
9 <li><a>Что можно перегрузить - особенности процесса</a><ul><li><a>Operator =</a></li>
10 <li><a>Ввод и вывод</a></li>
10 <li><a>Ввод и вывод</a></li>
11 <li><a>Унарные операторы</a></li>
11 <li><a>Унарные операторы</a></li>
12 <li><a>Инкремент и декремент</a></li>
12 <li><a>Инкремент и декремент</a></li>
13 <li><a>Индексация</a></li>
13 <li><a>Индексация</a></li>
14 <li><a>Operator ()</a></li>
14 <li><a>Operator ()</a></li>
15 <li><a>Аллокация и деаллокация</a></li>
15 <li><a>Аллокация и деаллокация</a></li>
16 <li><a>Пользовательские литералы</a></li>
16 <li><a>Пользовательские литералы</a></li>
17 </ul></li>
17 </ul></li>
18 </ul><p>Языки программирования используют разнообразные операторы для выполнения операций. В большинстве из них операторы имеют жесткую привязку к типам. Так, в Java сложение с оператором "+" допустимо только для целочисленных значений, чисел с плавающей запятой и строк. Если определить свои классы для математических объектов, разработчику удастся сложить их. Только для вызова соответствующего метода необходимо использовать специальные команды.</p>
18 </ul><p>Языки программирования используют разнообразные операторы для выполнения операций. В большинстве из них операторы имеют жесткую привязку к типам. Так, в Java сложение с оператором "+" допустимо только для целочисленных значений, чисел с плавающей запятой и строк. Если определить свои классы для математических объектов, разработчику удастся сложить их. Только для вызова соответствующего метода необходимо использовать специальные команды.</p>
19 <p>В C++ подобных ограничений нет. У данного языка программирования поддерживается так называемая перегрузка. Она возможна почти для каждого известного оператора. Это предоставляет целое поле дополнительных возможностей разработчику.</p>
19 <p>В C++ подобных ограничений нет. У данного языка программирования поддерживается так называемая перегрузка. Она возможна почти для каждого известного оператора. Это предоставляет целое поле дополнительных возможностей разработчику.</p>
20 <p>Далее предстоит познакомиться с перегрузкой операторов в C++ поближе. Необходимо не только выяснить, что это за операция такая, но и освоить принципы ее реализации. Предложенная информация окажется полезной как программистам-новичкам, так и более опытным разработчикам.</p>
20 <p>Далее предстоит познакомиться с перегрузкой операторов в C++ поближе. Необходимо не только выяснить, что это за операция такая, но и освоить принципы ее реализации. Предложенная информация окажется полезной как программистам-новичкам, так и более опытным разработчикам.</p>
21 <h2>Определение</h2>
21 <h2>Определение</h2>
22 <p>Перегрузка операторов - это один из способов реализации полиморфизма. Он заключается в возможности одновременного существования в одной и той же области видимости нескольких различных вариантов применения операторов, имеющих одно и то же имя, но различающихся типами параметров, к которым он применяется.</p>
22 <p>Перегрузка операторов - это один из способов реализации полиморфизма. Он заключается в возможности одновременного существования в одной и той же области видимости нескольких различных вариантов применения операторов, имеющих одно и то же имя, но различающихся типами параметров, к которым он применяется.</p>
23 <p>Перегрузка (или operator overloading) - операция, позволяющая определить для объектов классов встроенные операторы. Она широко используется разработчиками. Применяется для переопределения действий операторов языка в процессе работы с разнообразными (включая пользовательские) типами. Возможность применения встроенных операторов языка к разным типам данных.</p>
23 <p>Перегрузка (или operator overloading) - операция, позволяющая определить для объектов классов встроенные операторы. Она широко используется разработчиками. Применяется для переопределения действий операторов языка в процессе работы с разнообразными (включая пользовательские) типами. Возможность применения встроенных операторов языка к разным типам данных.</p>
24 <h2>Когда использовать процедуру</h2>
24 <h2>Когда использовать процедуру</h2>
25 <p>В процессе разработки программного обеспечения необходимо запомнить одно правило - перегружать операторы нужно тогда, когда соответствующая процедура имеет смысл: если он очевиден и не несет в себе никаких скрытых "сюрпризов" для программиста.</p>
25 <p>В процессе разработки программного обеспечения необходимо запомнить одно правило - перегружать операторы нужно тогда, когда соответствующая процедура имеет смысл: если он очевиден и не несет в себе никаких скрытых "сюрпризов" для программиста.</p>
26 <p>Перегруженные operators должны вести себя так же, как и их "базовые" версии. Исключения допустимы, но лишь тогда, когда они сопровождаются понятными разработчику объяснениями.</p>
26 <p>Перегруженные operators должны вести себя так же, как и их "базовые" версии. Исключения допустимы, но лишь тогда, когда они сопровождаются понятными разработчику объяснениями.</p>
27 <p>Примером подобной ситуации могут служить операторы "&lt;&lt;" и "&gt;&gt;" стандартной библиотеки C++ iostream. Они явно ведут себя не как обычный битовый сдвиг.</p>
27 <p>Примером подобной ситуации могут служить операторы "&lt;&lt;" и "&gt;&gt;" стандартной библиотеки C++ iostream. Они явно ведут себя не как обычный битовый сдвиг.</p>
28 <p>Чтобы лучше понимать, когда лучше применять перегрузку, стоит рассмотреть хороший и плохой примеры реализации соответствующей операции. Наглядным случаем является сложение матриц. Здесь перегрузка сложения является интуитивно понятной. Если грамотно реализовать процедуру, она не будет требовать пояснений.</p>
28 <p>Чтобы лучше понимать, когда лучше применять перегрузку, стоит рассмотреть хороший и плохой примеры реализации соответствующей операции. Наглядным случаем является сложение матриц. Здесь перегрузка сложения является интуитивно понятной. Если грамотно реализовать процедуру, она не будет требовать пояснений.</p>
29 <p>Пример плохой перегрузки сложения - это сложение двух объектов типа "игрок" в игровом проекте. Не совсем понятно, что разработчик имел в виду для этих классов. Результат непонятен, непредсказуем. Что делает соответствующая операция - огромный вопрос. Именно поэтому использование соответствующего оператора - опасное решение.</p>
29 <p>Пример плохой перегрузки сложения - это сложение двух объектов типа "игрок" в игровом проекте. Не совсем понятно, что разработчик имел в виду для этих классов. Результат непонятен, непредсказуем. Что делает соответствующая операция - огромный вопрос. Именно поэтому использование соответствующего оператора - опасное решение.</p>
30 <h2>Синтаксис</h2>
30 <h2>Синтаксис</h2>
31 <p>Синтаксис рассматриваемой процедуры напоминает определение функции с именем operator@, где @ - это идентификатор оператора. Вот наглядный пример реализации процесса:</p>
31 <p>Синтаксис рассматриваемой процедуры напоминает определение функции с именем operator@, где @ - это идентификатор оператора. Вот наглядный пример реализации процесса:</p>
32 <p>Обычно операторы (за исключением условных) будут возвращать объект или ссылку на тип, к которому относятся его аргументы.</p>
32 <p>Обычно операторы (за исключением условных) будут возвращать объект или ссылку на тип, к которому относятся его аргументы.</p>
33 <h2>Что нельзя перегружать</h2>
33 <h2>Что нельзя перегружать</h2>
34 <p>Перегрузка операций предусматривает некоторые особенности и ограничения, о которых должен помнить каждый разработчик. Почти любой operator C++ может быть перегружен. Вот ограничения и нюансы, о которых должен помнить каждый программист:</p>
34 <p>Перегрузка операций предусматривает некоторые особенности и ограничения, о которых должен помнить каждый разработчик. Почти любой operator C++ может быть перегружен. Вот ограничения и нюансы, о которых должен помнить каждый программист:</p>
35 <ul><li>определить новый оператор нельзя (operator**);</li>
35 <ul><li>определить новый оператор нельзя (operator**);</li>
36 <li>нельзя перегружать тернарный оператор, доступ ко вложенным именам, доступ к полям, доступ к полям по указателю;</li>
36 <li>нельзя перегружать тернарный оператор, доступ ко вложенным именам, доступ к полям, доступ к полям по указателю;</li>
37 <li>рассматриваемая процедура не допускается для операторов каста;</li>
37 <li>рассматриваемая процедура не допускается для операторов каста;</li>
38 <li>нельзя перегружать operator sizeof и operator typeid;</li>
38 <li>нельзя перегружать operator sizeof и operator typeid;</li>
39 <li>количество операндов, их ассоциативность и порядок выполнения определяется стандартной версией;</li>
39 <li>количество операндов, их ассоциативность и порядок выполнения определяется стандартной версией;</li>
40 <li>функция operator должна быть или нестатической (функцией-членом), или глобальной свободной функцией, или дружественной;</li>
40 <li>функция operator должна быть или нестатической (функцией-членом), или глобальной свободной функцией, или дружественной;</li>
41 <li>если функция дружественная, бинарный оператор имеет два аргумента, унарный - только один;</li>
41 <li>если функция дружественная, бинарный оператор имеет два аргумента, унарный - только один;</li>
42 <li>при работе с нестатической функцией-членом бинарный оператор имеет один аргумент, унарный - вовсе их не имеет;</li>
42 <li>при работе с нестатической функцией-членом бинарный оператор имеет один аргумент, унарный - вовсе их не имеет;</li>
43 <li>минимум один операнд должен быть пользовательского типа, исключая operator typedef.</li>
43 <li>минимум один операнд должен быть пользовательского типа, исключая operator typedef.</li>
44 </ul><p>Только в качестве методов можно перегружать: присваивание, доступ к полям по указателю, вызов функции, доступ по индексу, а также операторы конверсии и управления памятью, доступ к указателю на поле по указателю.</p>
44 </ul><p>Только в качестве методов можно перегружать: присваивание, доступ к полям по указателю, вызов функции, доступ по индексу, а также операторы конверсии и управления памятью, доступ к указателю на поле по указателю.</p>
45 <h2>Способы реализации</h2>
45 <h2>Способы реализации</h2>
46 <p>Перегрузка может быть реализована в C++ несколькими способами. Всего их три:</p>
46 <p>Перегрузка может быть реализована в C++ несколькими способами. Всего их три:</p>
47 <ul><li>через методы класса;</li>
47 <ul><li>через методы класса;</li>
48 <li>при помощи дружественных функций для класса;</li>
48 <li>при помощи дружественных функций для класса;</li>
49 <li>посредством обычных функций.</li>
49 <li>посредством обычных функций.</li>
50 </ul><p>Далее каждый вариант будет рассмотрен отдельно. Также предстоит изучить перегружаемые операторы C++ более подробно.</p>
50 </ul><p>Далее каждый вариант будет рассмотрен отдельно. Также предстоит изучить перегружаемые операторы C++ более подробно.</p>
51 <h3>Реализация через функцию</h3>
51 <h3>Реализация через функцию</h3>
52 <p>Для использования данного приема необходимо объявить функцию, которая будет переопределять operator тела класса. Соответствующая перегрузка не может обращаться к членам класса напрямую. Воспользоваться подобной операцией можно за счет геттеров.</p>
52 <p>Для использования данного приема необходимо объявить функцию, которая будет переопределять operator тела класса. Соответствующая перегрузка не может обращаться к членам класса напрямую. Воспользоваться подобной операцией можно за счет геттеров.</p>
53 <p>Такой прием рекомендуется использовать вместе операторной перегрузки через дружественные функции тогда, когда для этого нет никакой необходимости в добавлении дополнительных геттеров в класс.</p>
53 <p>Такой прием рекомендуется использовать вместе операторной перегрузки через дружественные функции тогда, когда для этого нет никакой необходимости в добавлении дополнительных геттеров в класс.</p>
54 <h3>Реализация через дружественные функции</h3>
54 <h3>Реализация через дружественные функции</h3>
55 <p>Такой подход напоминает предыдущий вариант. Он отличается от ранее изученной концепции тем, что задействована будет не обычная функция, а дружественная классу. Такой прием позволяет обращаться к членам класса напрямую. Геттеры для этого не нужны.</p>
55 <p>Такой подход напоминает предыдущий вариант. Он отличается от ранее изученной концепции тем, что задействована будет не обычная функция, а дружественная классу. Такой прием позволяет обращаться к членам класса напрямую. Геттеры для этого не нужны.</p>
56 <p>Дружественные функции могут быть определены внутри заданного класса.</p>
56 <p>Дружественные функции могут быть определены внутри заданного класса.</p>
57 <p>Выше можно увидеть наглядный пример реализации упомянутого метода в C++.</p>
57 <p>Выше можно увидеть наглядный пример реализации упомянутого метода в C++.</p>
58 <h3>Через методы класса</h3>
58 <h3>Через методы класса</h3>
59 <p>Еще один способ операторной перегрузки в C++ - это использование методов класса.</p>
59 <p>Еще один способ операторной перегрузки в C++ - это использование методов класса.</p>
60 <p>В этом случае у функции-метода вместо первого операнда появляется неявный параметр - указатель на объект класса. Выше - наглядный пример того, как это будет выглядеть в программном коде. Теперь можно более подробно рассмотреть операторы, для которых в C++ допустима перегрузка.</p>
60 <p>В этом случае у функции-метода вместо первого операнда появляется неявный параметр - указатель на объект класса. Выше - наглядный пример того, как это будет выглядеть в программном коде. Теперь можно более подробно рассмотреть операторы, для которых в C++ допустима перегрузка.</p>
61 <h2>Что можно перегрузить - особенности процесса</h2>
61 <h2>Что можно перегрузить - особенности процесса</h2>
62 <p>Далее будут представлены operators, которые можно перегружать. Каждый из них поддерживает характерную семантику (ожидаемое поведение) и типичные способы объявления/реализации.</p>
62 <p>Далее будут представлены operators, которые можно перегружать. Каждый из них поддерживает характерную семантику (ожидаемое поведение) и типичные способы объявления/реализации.</p>
63 <p>В первом приведенном примере X - это пользовательский тип, для которого будет реализован operator. T - необязательный тип, пользовательский или встроенный. В качестве параметров бинарного оператора выступают lhs и rhs. Если operator объявляется в качестве метода класса, он получит префикс x::.</p>
63 <p>В первом приведенном примере X - это пользовательский тип, для которого будет реализован operator. T - необязательный тип, пользовательский или встроенный. В качестве параметров бинарного оператора выступают lhs и rhs. Если operator объявляется в качестве метода класса, он получит префикс x::.</p>
64 <h3>Operator =</h3>
64 <h3>Operator =</h3>
65 <p>Operator = - это присваивание. Его семантика:</p>
65 <p>Operator = - это присваивание. Его семантика:</p>
66 <p>a = b</p>
66 <p>a = b</p>
67 <p>Соответствующая запись указывает на то, что значение/состояние b будет передано a. В процессе реализации возвращается ссылка на a. За счет этого приема можно создавать цепочки вроде c = a = b.</p>
67 <p>Соответствующая запись указывает на то, что значение/состояние b будет передано a. В процессе реализации возвращается ссылка на a. За счет этого приема можно создавать цепочки вроде c = a = b.</p>
68 <p>Operator = определяется справа налево. Он правоассоциативен в отличие от большинства других операторов C++. Это значит, что a = b = c означает a = (b = c).</p>
68 <p>Operator = определяется справа налево. Он правоассоциативен в отличие от большинства других операторов C++. Это значит, что a = b = c означает a = (b = c).</p>
69 <p>Типичным объявлением копирования является запись: X&amp; X:: operator = (X const&amp; rhs).</p>
69 <p>Типичным объявлением копирования является запись: X&amp; X:: operator = (X const&amp; rhs).</p>
70 <p>Перемещения, начиная с C++ 11, имеют семантику присваивания a = temporary(). Значение или состояние правой величины присваивается a за счет перемещения содержимого. На a будет возвращаться ссылка.</p>
70 <p>Перемещения, начиная с C++ 11, имеют семантику присваивания a = temporary(). Значение или состояние правой величины присваивается a за счет перемещения содержимого. На a будет возвращаться ссылка.</p>
71 <h3>Ввод и вывод</h3>
71 <h3>Ввод и вывод</h3>
72 <p>Operator &lt;&lt; может перегружаться, чтобы добиться более удобного вывода сложных структур в поток вывода.</p>
72 <p>Operator &lt;&lt; может перегружаться, чтобы добиться более удобного вывода сложных структур в поток вывода.</p>
73 <p>Выше - наглядный пример реализации соответствующей операции. аналогичным образом можно перегрузить operator &gt;&gt;. В этом случае вместо std:: ostream необходимо использовать std::istream.</p>
73 <p>Выше - наглядный пример реализации соответствующей операции. аналогичным образом можно перегрузить operator &gt;&gt;. В этом случае вместо std:: ostream необходимо использовать std::istream.</p>
74 <h3>Унарные операторы</h3>
74 <h3>Унарные операторы</h3>
75 <p>В случае с унарными operators функция переопределения будет принимать на выход только один операнд. Operator + чаще всего ничего не делает, поэтому на практике он почти не используется. Operator - осуществляет возврат аргумента с противоположным знаком.</p>
75 <p>В случае с унарными operators функция переопределения будет принимать на выход только один операнд. Operator + чаще всего ничего не делает, поэтому на практике он почти не используется. Operator - осуществляет возврат аргумента с противоположным знаком.</p>
76 <p>Из-за того, что функция перегрузки принимает только один операнд на вход, рекомендуется осуществлять рассматриваемую операцию посредством метода класса. Выше представлен наглядный пример реализации соответствующего приема.</p>
76 <p>Из-за того, что функция перегрузки принимает только один операнд на вход, рекомендуется осуществлять рассматриваемую операцию посредством метода класса. Выше представлен наглядный пример реализации соответствующего приема.</p>
77 <p>Метод должен быть объявлен в качестве константного. Это необходимо из-за того, что объект класса не меняется, а возвращается новый экземпляр класса.</p>
77 <p>Метод должен быть объявлен в качестве константного. Это необходимо из-за того, что объект класса не меняется, а возвращается новый экземпляр класса.</p>
78 <h3>Инкремент и декремент</h3>
78 <h3>Инкремент и декремент</h3>
79 <p>Operator ++ (инкремент) и operator - (декремент) предусматривают две версии:</p>
79 <p>Operator ++ (инкремент) и operator - (декремент) предусматривают две версии:</p>
80 <ul><li>постфиксную;</li>
80 <ul><li>постфиксную;</li>
81 <li>префиксную.</li>
81 <li>префиксную.</li>
82 </ul><p>При перегрузке операторов необходимо различать соответствующие формы инкремента и декремента. Для этого у постфиксных версий имеется так называемый фиктивный параметр типа int. При его наличии компилятор будет понимать, что осуществляется перегрузка постфиксной версии. Если фиктивный параметр отсутствует, целесообразно говорить о работе с префиксной версией.</p>
82 </ul><p>При перегрузке операторов необходимо различать соответствующие формы инкремента и декремента. Для этого у постфиксных версий имеется так называемый фиктивный параметр типа int. При его наличии компилятор будет понимать, что осуществляется перегрузка постфиксной версии. Если фиктивный параметр отсутствует, целесообразно говорить о работе с префиксной версией.</p>
83 <p>Operator префиксной версии будут возвращать объект после того, как он был увеличен или уменьшен. В постфиксной интерпретации это происходит до уменьшения/увеличения. Из-за данной особенности в необходимо использовать в постфиксной версии временный объект. Он отвечает за возврат значения до его корректировки.</p>
83 <p>Operator префиксной версии будут возвращать объект после того, как он был увеличен или уменьшен. В постфиксной интерпретации это происходит до уменьшения/увеличения. Из-за данной особенности в необходимо использовать в постфиксной версии временный объект. Он отвечает за возврат значения до его корректировки.</p>
84 <p>Соответствующее явление также приводит к тому, что при возврате невозможно использовать ссылки. Это вызвано уничтожением временного объекта при осуществлении выхода из функции. В постфиксной версии возвращаемое значение - это объект класса. Он дает меньшую эффективность.</p>
84 <p>Соответствующее явление также приводит к тому, что при возврате невозможно использовать ссылки. Это вызвано уничтожением временного объекта при осуществлении выхода из функции. В постфиксной версии возвращаемое значение - это объект класса. Он дает меньшую эффективность.</p>
85 <h3>Индексация</h3>
85 <h3>Индексация</h3>
86 <p>Еще один вариант переопределения функции в C++ - это работа с индексацией. Ниже приведен пример реализации соответствующей операции:</p>
86 <p>Еще один вариант переопределения функции в C++ - это работа с индексацией. Ниже приведен пример реализации соответствующей операции:</p>
87 <p>Для константных объектов, когда нельзя корректировать их содержимое, допустимо использовать константную версию функции.</p>
87 <p>Для константных объектов, когда нельзя корректировать их содержимое, допустимо использовать константную версию функции.</p>
88 <p>При перегрузке индексации допустимо использование проверки передаваемого индекса на факт корректности. В качестве индекса может выступать целое число или любой другой тип данных: string, double и так далее.</p>
88 <p>При перегрузке индексации допустимо использование проверки передаваемого индекса на факт корректности. В качестве индекса может выступать целое число или любой другой тип данных: string, double и так далее.</p>
89 <h3>Operator ()</h3>
89 <h3>Operator ()</h3>
90 <p>Operator () в C++ используется не для изменения объекта, а для его дальнейшего использования в качестве функции. Этот элемент разработки не имеет ограничений на параметры. Подразумевается их количество и типы. Перегрузка оператора осуществляется в качестве метода класса.</p>
90 <p>Operator () в C++ используется не для изменения объекта, а для его дальнейшего использования в качестве функции. Этот элемент разработки не имеет ограничений на параметры. Подразумевается их количество и типы. Перегрузка оператора осуществляется в качестве метода класса.</p>
91 <p>Типичным примером объявления может служить запись типа: Foo X::operator() (Bar br, Baz const&amp; bz).</p>
91 <p>Типичным примером объявления может служить запись типа: Foo X::operator() (Bar br, Baz const&amp; bz).</p>
92 <h3>Аллокация и деаллокация</h3>
92 <h3>Аллокация и деаллокация</h3>
93 <p>Operators new new[] delete delete[] тоже поддерживают возможность переопределения. Они способны принимать любое количество аргументов. Операторы new new[] в качестве первого аргумента принимают аргумент типа sgt::size_t, а возвращать значение типа void *. Operators delete delete[] принимают первым void * и ничего не возвращать. Соответствующие операции могут быть перегружены как функции, а также для определенных классов.</p>
93 <p>Operators new new[] delete delete[] тоже поддерживают возможность переопределения. Они способны принимать любое количество аргументов. Операторы new new[] в качестве первого аргумента принимают аргумент типа sgt::size_t, а возвращать значение типа void *. Operators delete delete[] принимают первым void * и ничего не возвращать. Соответствующие операции могут быть перегружены как функции, а также для определенных классов.</p>
94 <p>Выше можно увидеть наглядный пример реализации соответствующей операции.</p>
94 <p>Выше можно увидеть наглядный пример реализации соответствующей операции.</p>
95 <h3>Пользовательские литералы</h3>
95 <h3>Пользовательские литералы</h3>
96 <p>После появления C++ 11 версии язык получил так называемые пользовательские литералы. Такие литералы будут вести себя как обычные функции. Они могут обладать квалификатором inline или constexpr. Рекомендуется начинать литерал с символа нижнего подчеркивания. Это необходимо для того, чтобы исключить коллизию с будущими стандартами.</p>
96 <p>После появления C++ 11 версии язык получил так называемые пользовательские литералы. Такие литералы будут вести себя как обычные функции. Они могут обладать квалификатором inline или constexpr. Рекомендуется начинать литерал с символа нижнего подчеркивания. Это необходимо для того, чтобы исключить коллизию с будущими стандартами.</p>
97 <p>Пользовательские литералы при перегрузке операторов могут принимать только один тип:</p>
97 <p>Пользовательские литералы при перегрузке операторов могут принимать только один тип:</p>
98 <ul><li>const char *;</li>
98 <ul><li>const char *;</li>
99 <li>unsigned long long int;</li>
99 <li>unsigned long long int;</li>
100 <li>wchar_t;</li>
100 <li>wchar_t;</li>
101 <li>char;</li>
101 <li>char;</li>
102 <li>long double;</li>
102 <li>long double;</li>
103 <li>char16_t;</li>
103 <li>char16_t;</li>
104 <li>char32_t.</li>
104 <li>char32_t.</li>
105 </ul><p>Достаточно осуществить перегрузку литерала только для типа const char *. Если подходящего кандидата система не нашла, будет произведен вызов оператора с соответствующим типом. Вот наглядный пример преобразования миль в километры при помощи изучаемого процесса:</p>
105 </ul><p>Достаточно осуществить перегрузку литерала только для типа const char *. Если подходящего кандидата система не нашла, будет произведен вызов оператора с соответствующим типом. Вот наглядный пример преобразования миль в километры при помощи изучаемого процесса:</p>
106 <p>При перегрузке операторов строковые литералы принимают вторым аргументом std::size_t, а первым, один из:</p>
106 <p>При перегрузке операторов строковые литералы принимают вторым аргументом std::size_t, а первым, один из:</p>
107 <ul><li>const char32_t;</li>
107 <ul><li>const char32_t;</li>
108 <li>const wchar_t;</li>
108 <li>const wchar_t;</li>
109 <li>const char16_t;</li>
109 <li>const char16_t;</li>
110 <li>const char *.</li>
110 <li>const char *.</li>
111 </ul><p>Строковые литералы применяются к записям, которые оформлены двойными кавычками.</p>
111 </ul><p>Строковые литералы применяются к записям, которые оформлены двойными кавычками.</p>
112 <p>В C++ имеется встроенный префиксный строковый литерал R. Он воспринимает все символы, написанные в кавычках, как обычные. R не интерпретирует отдельно взятые последовательности в качестве специальных символов. В качестве примера можно взять команду std::cout &lt;&lt; R’’(Hello!\n)’’. Она выведет на экран запись Hello!\n.</p>
112 <p>В C++ имеется встроенный префиксный строковый литерал R. Он воспринимает все символы, написанные в кавычках, как обычные. R не интерпретирует отдельно взятые последовательности в качестве специальных символов. В качестве примера можно взять команду std::cout &lt;&lt; R’’(Hello!\n)’’. Она выведет на экран запись Hello!\n.</p>
113 <p>Чтобы лучше знать C++, рекомендуется пройти <a>дистанционные компьютерные курсы</a>.</p>
113 <p>Чтобы лучше знать C++, рекомендуется пройти <a>дистанционные компьютерные курсы</a>.</p>
114  
114