Типы значений
Типы значений
B Java и C# различаются типы значений и типы ссылок.
• Типы значений. Это такие элементарные типы, как char, int и float, а также структуры struct в C#. Характерным для них является то, что для их создания не используется оператор new и оператор присваивания копирует значение переменной. Например:
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.
Более 800 000 книг и аудиокниг! 📚
Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением
ПОЛУЧИТЬ ПОДАРОКЧитайте также
15.3. Редактирование значений компонентов
15.3. Редактирование значений компонентов В версии 9.1 атрибуты называются свойствами (Properties) и изменяются в окне Property Editor. Редактор свойств открывается из всплывающего меню, которое можно открыть для любого маркированного компонента нажатием правой кнопки мыши. Именно
Присваивание значений
Присваивание значений Значения переменным присваиваются с помощью обыкновенного знака равенства. Например, чтобы поместить число 3 в переменную с именем intC, напечатайте intC = 3В VBA оператор присваивания представляет собой связанную знаком равенства конструкцию, с
Типы, характеризуемые значениями, ссылочные типы и оператор присваивания
Типы, характеризуемые значениями, ссылочные типы и оператор присваивания Теперь изучите следующий метод Main() и рассмотрите его вывод, показанный на рис. 3.12.static void Main(string[] args) { Console.WriteLine("*** Типы, характеризуемые значением / Ссылочные типы ***"); Console.WriteLine(-› Создание p1"); MyPoint
Типы, характеризуемые значениями и содержащие ссылочные типы
Типы, характеризуемые значениями и содержащие ссылочные типы Теперь, когда вы чувствуете разницу между типами, характеризуемыми значением, и ссылочными типами, давайте рассмотрим более сложный пример. Предположим, что имеется следующий ссылочный тип (класс),
Типы, характеризуемые значениями, и ссылочные типы: заключительные замечания
Типы, характеризуемые значениями, и ссылочные типы: заключительные замечания Чтобы завершить обсуждение данной темы, изучите информацию табл. 3.8, в которой приводится краткая сводка основных отличий между типами, характеризуемыми значением, и ссылочными типами.Таблица
Определение цветовых значений
Определение цветовых значений Многие методы визуализации, определенные классом Graphics, требуют от вас указания цвета, который должен использоваться в процессе рисования. Структура System.Drawing.Color представляет цветовую константу ARGB (от Alpha-Red-Green-Blue – альфа, красный, зеленый,
1.1. Типы числовых значений
1.1. Типы числовых значений Контекст математической точности для операций с точным значением включает типы данных с точным значением (DECIMAL и целочисленные типы) и числовые литералы с точным значением. Типы данных с приблизительным значением и числовые литералы все еще
Области значений
Области значений Область значений — это интервал от минимального до максимального значения, которое может быть представлено в переменной данного типа. В таблице 3.3 приведен размер занимаемой памяти и области значений переменных для каждого типа. Поскольку переменных
4.2. Присваивание значений переменным
4.2. Присваивание значений переменным =оператор присваивания (пробельные символы до и после оператора -- недопустимы) Не путайте с операторами сравнения = и -eq!Обратите внимание: символ = может использоваться как в качестве оператора присваивания, так и в качестве
1.8.1. Обработка значений umask
1.8.1. Обработка значений umask Команда umask задает восьмеричное число, которое при создании каждого файла и каталога вычитается из стандартного значения режима доступа. Полученное значение режима присваивается файлу или каталогу. Стандартному режиму доступа к каталогам
14.2.4. Объединение значений переменных
14.2.4. Объединение значений переменных Чтобы объединить значения переменных, достаточно последовательно расположить переменные:echo ${имя_переменной}${имя_переменной}. . ,$ FIRST="Bruce " $ SURNAME=Willis $ echo ${FIRST}${SURNAME}Bruce
17.5.2. Проверка численных значений
17.5.2. Проверка численных значений Команду expr можно применять для выполнения сравнений чисел. Если вычисления выполняются с числами, отличными от целых, отображается сообщение об ошибке, например:$ expr rr + 1expr: нечисловой аргументИтак, необходимо передать значение