Jump to content

Нарезка объектов

В на C++ программировании нарезка объекта происходит, когда объект типа подкласса копируется в объект типа суперкласса: копия суперкласса не будет иметь никаких переменных-членов или функций-членов, определенных в подклассе. Эти переменные и функции фактически «отрезаны».

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

Эта проблема не является уникальной для C++, но она не возникает естественным образом в большинстве других объектно-ориентированных языков — даже в родственниках C++, таких как D , Java и C# — поскольку копирование объектов не является базовой операцией в этих языках.

Вместо этого эти языки предпочитают манипулировать объектами посредством неявных ссылок, поэтому только копирование ссылки базовой операцией является .

В C++, напротив, объекты копируются автоматически всякий раз, когда функция принимает аргумент объекта по значению или возвращает объект по значению.

Кроме того, из-за отсутствия сборки мусора в C++ программы часто копируют объект, когда право собственности и время жизни одного общего объекта неясны. Например, вставка объекта в коллекцию стандартной библиотеки (например, std::vector ) обычно включает в себя создание и вставку копии в коллекцию.

struct A
{
    A(int a) : a_var(a) {}
    int a_var;
};

struct B : public A
{
    B(int a, int b) : A(a), b_var(b) {}
    int b_var;
};

B &getB()
{
    static B b(1, 2);
    return b;
}

int main()
{
    // Normal assignment by value to a
    A a(3);
    // a.a_var == 3
    a = getB();
    // a.a_var == 1, b.b_var not copied to a

    B b2(3, 4);
    // b2.a_var == 3, b2.b_var == 4
    A &a2 = b2;
    // Partial assignment by value through reference to b2
    a2 = getB();
    // b2.a_var == 1, b2.b_var == 4!

    return 0;
}

См. также

[ редактировать ]
[ редактировать ]
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: 2ed255cebd6ac91c2e4b9b9877283419__1718605620
URL1:https://arc.ask3.ru/arc/aa/2e/19/2ed255cebd6ac91c2e4b9b9877283419.html
Заголовок, (Title) документа по адресу, URL1:
Object slicing - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)