Почему мой конструктор копирования не работает с новым вызовом и имеет тот же адрес памяти?

0

Можно ли использовать конструктор копирования с новым ключевым словом? Мой код также показывает, что 2 указателя obj имеют одинаковый адрес памяти?

#include <iostream>

using namespace std;

class Person{

public:

    int age;

        Person() {     }
        Person(const Person& p ) : age(p.age) {        }

};
int main()
{

    Person *p = new Person();
    p->age = 15;

    Person *y = p;

    // Person *z = new Person(p); why no work???


    // p and y have the same memory addres??
    std::cout << p;
    std::cout << y;

    return 0;
}
Теги:

3 ответа

2
Лучший ответ
Person *z = new Person(p); // why no work???

Поскольку p является указателем, а не Person&. Вам нужно разыменовать его, чтобы получить объект:

Person *z = new Person(*p);
//                     ^^
  • 3
    @ runners3431 Чтобы продолжить, конечно, y == p: вы устанавливаете указатели равными. Указатель - это область памяти, поэтому его можно копировать бесконечно. Это похоже на миллион указателей, направленных на Бостон: еще только один Бостон.
  • 0
    Хорошо, я думал, когда вы создаете новый указатель, этот указатель создается и получает новый адрес памяти. Забыли, я должен сделать & р.
2

Лучше всего почти во всех отношениях

int main()
{

Person p;
p.age = 15;

Person y(p);


std::cout << &p;
std::cout << &y;

return 0;
}

new не твой друг. new - это враг всего, что есть RAII. Вниз с new.

  • 0
    спасибо, я сделаю некоторые исследования в RAii
0

Потому что p - указатель.

Пытаться

Person *z = new Person(*p);

Ещё вопросы

Сообщество Overcoder
Наверх
Меню