Копия объекта и копия указателя в C++
При присваивании объектов компилятор копирует поля в новый экземпляр - получаются два независимых значения.
Запишем класс User с именем и возрастом:
#include <iostream>
#include <string>
class User {
public:
std::string name;
int age;
User(std::string name, int age) : name(name), age(age) {}
};
Создадим два объекта, скопируем один в другой и выведем оба имени:
int main() {
User user1("john", 30);
User user2 = user1;
user2.name = "eric";
std::cout << user1.name << "\n";
std::cout << user2.name << "\n";
return 0;
}
При присваивании указателей копируется только адрес -
обе переменные ведут к одному объекту в памяти.
Запишем класс User:
#include <iostream>
#include <string>
class User {
public:
std::string name;
int age;
User(std::string name, int age) : name(name), age(age) {}
};
Создадим два указателя на один объект, изменим поле и выведем имя:
int main() {
User user("john", 30);
User* a = &user;
User* b = a;
b->name = "eric";
std::cout << a->name << "\n";
std::cout << user.name << "\n";
return 0;
}
Тот же объект может лежать в векторе, а адрес
на него - в отдельном указателе. Запишем класс User:
#include <iostream>
#include <vector>
class User {
public:
int age;
User(int age) : age(age) {}
};
Создадим вектор, изменим возраст через указатель и выведем его:
int main() {
std::vector<User> people;
people.push_back(User(20));
User* p = &people[0];
p->age = 25;
std::cout << people[0].age << "\n";
return 0;
}
Создайте объект Employee и скопируйте его
в вторую переменную. Измените зарплату у копии.
Выведите зарплату из исходной переменной.
Создайте объект Employee, запишите его адрес
в два указателя. Измените имя через второй указатель.
Выведите имя через первый указатель.