Нарезка объектов
В на 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;
}