#include<iostream>
class A{
public :
int a;
};
int main(){
A obj;
obj.a = 5;
A b(obj);
b.a = 6;
std::cout<<obj.a;
return 0;
}
почему ответ возвращается как 5, по умолчанию конструктор копирования в C ++ возвращает поверхностную копию. Разве мелкая копия не означает ссылку?
или я что-то упустил?
мелкая копия означает ссылку ?? или я что-то упустил?
Вы что-то упускаете. Мелкая копия означает копирование. Он копирует всех членов объекта из одного в другой. Это НЕ ссылка. Созданная копия полностью независима от оригинала
Увидеть этот отличный учебник для разницы между мелкой и глубокой копией.
b
это совершенно отдельный объект от obj
, Имеет свой a
независим от obj
«S.
Похоже, что вы имеете в виду ссылка:
A& b = obj;
После этого оба b
а также obj
ссылаются на тот же объект. Изменения, сделанные через b
было бы видно через obj
и наоборот.
мелкая копия означает ссылку ?? или я что-то упустил?
Да, ты что-то упустил.
Мелкая копия не означает ссылку. Мелкая копия означает копирование члены: если член является указателем, то он копии адрес, а не содержание указатель указывая на. Это означает, что указатели на исходный объект и так называемый скопированный объект указывают на тот же контент в памяти. Это называется мелкой копией. Глубокая копия, с другой стороны, не копирует адрес, она создает новый указатель (в новом объекте), выделяет для него память, а затем копирует содержимое оригинальный указатель указывает на.
В вашем случае, мелкое копирование и глубокое копирование не имеют значения, потому что в классе нет указательных членов. Каждый участник копируется (по-прежнему), и поскольку ни один элемент не является указателем, каждый скопированный элемент является разные член в памяти. То есть исходный объект и скопированный объект — это совершенно разные объекты в памяти. Нет абсолютно ничего, что эти два объекта разделяют друг с другом. Поэтому, когда вы изменяете одно, это совсем не меняет ничего в другом.
Да, конструктор копирования по умолчанию является мелкой копией. Узнать больше Вот
Но, b полностью не пересекается с a, поэтому две вещи не связаны напрямую.
A b(obj)
копии obj
информация во вновь созданный объект b
, Да это мелкая копия так b
на самом деле не контролирует то, что ему назначено. То, о чем вы, вероятно, думаете, это ссылка:
A& b = obj;
b.a = 6;
std::cout << obj.a; // 6