Подпишитесь на наш Telegram-канал, чтобы всегда быть в курсе важных обновлений! Перейти

C++ Эксперты по C++ nоясните в чем разница?

Пользователь
Пользователь
Статус
Оффлайн
Регистрация
23 Окт 2020
Сообщения
99
Реакции
46
Вот код для примера.
C++:
Expand Collapse Copy
#include <iostream>
using namespace std;

class simple
{
private:
    int var;
public:
    void getvar( int v)
    {
        var = v;
    }
    void showvar()
    {
        cout << var << endl;
    }
};

int main()
{
    simple& sm = *(new simple);
    sm.getvar(23);
    sm.showvar();

    simple sm2 = *(new simple);
    sm2.getvar(54);
    sm2.showvar();

    return 0;
}
В чем разница между этим
C++:
Expand Collapse Copy
simple& sm = *(new simple);
и
C++:
Expand Collapse Copy
simple sm2 = *(new simple);
этим.
Почему они работают как надо, но в первом случае используется ссылка а во втором нет?
 
Вот код для примера.
C++:
Expand Collapse Copy
#include <iostream>
using namespace std;

class simple
{
private:
    int var;
public:
    void getvar( int v)
    {
        var = v;
    }
    void showvar()
    {
        cout << var << endl;
    }
};

int main()
{
    simple& sm = *(new simple);
    sm.getvar(23);
    sm.showvar();

    simple sm2 = *(new simple);
    sm2.getvar(54);
    sm2.showvar();

    return 0;
}
В чем разница между этим
C++:
Expand Collapse Copy
simple& sm = *(new simple);
и
C++:
Expand Collapse Copy
simple sm2 = *(new simple);
этим.
Почему они работают как надо, но в первом случае используется ссылка а во втором нет?
1629998524617.png

Ты хотя бы понял что это 2 разные функции?
 
Потому что нет разницы что использовать, ссылку или указатель еа функцию
Возможно я что то не понял, потому что у меня не все в порядке с мозгами ( на данный момент их нет )
 
Возможно я что то не понял, потому что у меня не все в порядке с мозгами ( на данный момент их нет )
Ну он сделал ссылку на структуру откуда вызывает ее поля и указатель на структуру откуда тоже вызывает ее поля и методы. Думаю сам понимаешь.
 
Ну он сделал ссылку на структуру откуда вызывает ее поля и указатель на структуру откуда тоже вызывает ее поля и методы. Думаю сам понимаешь.
Все понял. Тему закрывайте ответили )
 
Почему они работают как надо, но в первом случае используется ссылка а во втором нет?
А почему один из приведенных Вами примеров не должен работать? В первом случае переменная sm будет хранить в себе не экземпляр класса simple, а ссылку на недоступный к прямому обращению экземпляр в памяти. Во втором же случае переменная как раз является экземпляром Вашего класса.
Попробуйте следующий код, чтобы понять разницу практически:
C++:
Expand Collapse Copy
int main() {
    auto tmp = *(new simple);
    simple& sm = tmp;
    sm.getvar(23);
    cout << "sm: ";
    sm.showvar();

    cout << "tmp: ";
    tmp.showvar();


    tmp = *(new simple);
    simple sm2 = tmp;
    sm2.getvar(54);
    cout << "sm: ";
    sm2.showvar();

    cout << "tmp: ";
    tmp.showvar();

    return 0;
}
Вывод:
1630003525666.png
 
1) simple& sm = *(new simple);
2) simple sm2 = *(new simple);
new возвращает указатель, т.е. simple*, при этом аллокатор выделит память в куче (такой большой буффер памяти) и вызовет конструктор по умолчанию, т.е. simple();
Когда от указателя вызывается * происходит дереференс и возвращается ссылка т.е. simple&;
В 1 случае sm будет указывать на память в куче, а в стеке будет храниться просто ссылка на этот участок памяти, объект будет существовать только в одном экземпляре.
В 2 случае sm2 уже без ссылки, поэтому sm2 будет содержать еще один экземпляр simple но уже на стеке (это участок памяти отдельный для каждого потока), при этом он приравнивается объекту из кучи, а именно сконструируется его копия т.е. вызовется конструктор копирования simple(const Simple&);
При этом объекты на стеке уничтожаются сами как только выходят из области видимости, а вот выделенные через new нужно освобождать через delete.
 
Назад
Сверху Снизу