Поделиться через


Простое назначение (C++)

Простой оператор присваивания (=) сохраняет значение второго операнда в объекте, указанном первым операндом. Если оба объекта имеют арифметические типы, перед сохранением значения правый операнд преобразуется к типу левого.

Объекты типов const и volatile могут присваиваться значениям l-value типов, которые являются просто volatile или не являются ни const, ни volatile.

Присваивание объектам типа класса (типы структур, объединений и классов) выполняется с помощью функции operator=. По умолчанию эта функция-оператор производит побитовое копирование; однако такое поведение можно изменить с помощью перегруженных операторов. (Дополнительные сведения см. в разделе Перегруженные операторы.)

Объект любого класса, однозначно производного от некоторого базового класса, можно присвоить объекту этого базового класса. Обратное неверно, поскольку существует неявное преобразование из производного класса в базовый класс, но не из базового класса в производный класс. Например:

// expre_SimpleAssignment.cpp
// compile with: /EHsc
#include <iostream>
using namespace std;
class ABase
{
public:
    ABase() { cout << "constructing ABase\n"; }
};

class ADerived : public ABase
{
public:
    ADerived() { cout << "constructing ADerived\n"; }
};

int main()
{
    ABase aBase;
    ADerived aDerived;

    aBase = aDerived; // OK
    aDerived = aBase; // C2679
}

Присваивание ссылочным типам выполняется так, как если бы выполнялось присваивание объекту, на который указывает ссылка.

Для объектов типа класса присваивание отличается от инициализации. Для иллюстрации того, насколько сильно присваивание может отличаться от инициализации, рассмотрим код

UserType1 A;
UserType2 B = A;

В предыдущем коде показан инициализатор; он вызывает конструктор для типа UserType2, который принимает аргумент типа UserType1. В коде

UserType1 A;
UserType2 B;

B = A;

оператор присваивания

B = A; 

может вызывать одно из указанных ниже действий.

  • Вызывать функцию operator= для типа UserType2 при условии, что функция operator= определена для аргумента типа UserType1.

  • Вызывать функцию явного преобразования UserType1::operator UserType2, если такая функция существует.

  • Вызывать конструктор UserType2::UserType2, если он существует, принимает аргумент UserType1 и копирует результат.

См. также

Ссылки

Выражения с бинарными операторами