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

Пользователь
Статус
Оффлайн
Регистрация
23 Окт 2020
Сообщения
98
Реакции[?]
46
Поинты[?]
0
Вот код для примера.
C++:
#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++:
simple& sm = *(new simple);
и
C++:
simple sm2 = *(new simple);
этим.
Почему они работают как надо, но в первом случае используется ссылка а во втором нет?
 
Пользователь
Статус
Оффлайн
Регистрация
28 Фев 2021
Сообщения
591
Реакции[?]
118
Поинты[?]
0
Вот код для примера.
C++:
#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++:
simple& sm = *(new simple);
и
C++:
simple sm2 = *(new simple);
этим.
Почему они работают как надо, но в первом случае используется ссылка а во втором нет?
1629998524617.png
Ты хотя бы понял что это 2 разные функции?
 
Олдфаг
Статус
Оффлайн
Регистрация
4 Янв 2020
Сообщения
2,996
Реакции[?]
1,275
Поинты[?]
5K
Потому что нет разницы что использовать, ссылку или указатель еа функцию
 
Пользователь
Статус
Оффлайн
Регистрация
28 Фев 2021
Сообщения
591
Реакции[?]
118
Поинты[?]
0
Потому что нет разницы что использовать, ссылку или указатель еа функцию
Возможно я что то не понял, потому что у меня не все в порядке с мозгами ( на данный момент их нет )
 
Олдфаг
Статус
Оффлайн
Регистрация
4 Янв 2020
Сообщения
2,996
Реакции[?]
1,275
Поинты[?]
5K
Возможно я что то не понял, потому что у меня не все в порядке с мозгами ( на данный момент их нет )
Ну он сделал ссылку на структуру откуда вызывает ее поля и указатель на структуру откуда тоже вызывает ее поля и методы. Думаю сам понимаешь.
 
Пользователь
Статус
Оффлайн
Регистрация
28 Фев 2021
Сообщения
591
Реакции[?]
118
Поинты[?]
0
Ну он сделал ссылку на структуру откуда вызывает ее поля и указатель на структуру откуда тоже вызывает ее поля и методы. Думаю сам понимаешь.
Все понял. Тему закрывайте ответили )
 
Олдфаг
Статус
Оффлайн
Регистрация
18 Фев 2019
Сообщения
2,826
Реакции[?]
1,853
Поинты[?]
24K
Почему они работают как надо, но в первом случае используется ссылка а во втором нет?
А почему один из приведенных Вами примеров не должен работать? В первом случае переменная sm будет хранить в себе не экземпляр класса simple, а ссылку на недоступный к прямому обращению экземпляр в памяти. Во втором же случае переменная как раз является экземпляром Вашего класса.
Попробуйте следующий код, чтобы понять разницу практически:
C++:
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
 
Keine panik!
Эксперт
Статус
Оффлайн
Регистрация
29 Апр 2020
Сообщения
812
Реакции[?]
417
Поинты[?]
49K
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.
 
Сверху Снизу