Форум программистов, компьютерный форум CyberForum.ru

Возвращение ссылки на локальную переменную - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Что делать если нужно знести информацию в 2 разных объекта базового класса при закрытом наследование http://www.cyberforum.ru/cpp-beginners/thread1237496.html
Что делать если нужно знести информацию в 2 разных объекта базового класса при закрытом наследование? Например мне нужно держать скажем имя и проффесию в разных обьектах string.
C++ Разделить строку типа string на лексемы Есть строка string, нужно разбить её на лексемы. У меня не получается использовать strtok с типом string. http://www.cyberforum.ru/cpp-beginners/thread1237481.html
C++ Разделить строку типа string на лексемы
Есть строка string, нужно разбить её на лексемы. У меня не получается использовать strtok с типом string.
C++ Использование string в многофайловом приложении. Необходимость подключения библиотек и пространства имён
Здравствуйте. Есть заголовочный и cpp файлы. В заголовочном пишу#ifndef MODEL_H #define MODEL_H struct Vertex { float x, y, z; Vertex(float x = 0.0f, float y = 0.0f, float z = 0.0f) { this->x = x; this->y = y;
C++ Преобразование long double в char http://www.cyberforum.ru/cpp-beginners/thread1237432.html
Вернемся к обсуждению денежных строк из упражнения 6. Напишите ме- од ldtoms() для преобразования числа типа long double в денежную строку, представляющую это число. Для начала вам нужно проверить, что значе-ние long double не очень большое. Мы предполагаем, что вы не будете пы-таться преобразовать число, больше чем 9 999 999 999 999 990.00. Затем преобразуем long double в строку (без знака...
C++ Rand() создает одинаковые числа inline void Playing_card::set_random_suit() { std::srand(time(NULL)); suit_.val = rand() % (SPADES - CLUBS) + CLUBS; suit_.lexcast(); } При создании нескольких объектов Playing_card, во всех созданных обьект val_ одинаковый? Почему? Скажите пожалуйста. подробнее

Показать сообщение отдельно
__SOKOL__
3 / 3 / 0
Регистрация: 29.06.2013
Сообщений: 107
02.08.2014, 09:28     Возвращение ссылки на локальную переменную
Вот так можешь увидеть адрес своей переменной из функции.
Функция возвращает ссылку, и работает правильно выводя 99, а не адрес, ведь в выводе ты не поставил знак амперсанда перед вызовом функции.

Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
using namespace std;
 
int& func();
 
int main()
{
    cout << &func() << endl;
    return 0;
}
 
int& func()
{
    int a = 5;
    return a;
}


Но так делать не рекомендуется:
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
using namespace std;
 
int& func();
 
int main()
{
    int &b = func();
    cout << &b << endl;
    cout << b << endl;
    return 0;
}
 
int& func()
{
    int a = 5;
    return a;
}

Так будет потеря данных.
Адрес ты примешь, но значение этого адреса изменится, так как переменная локальная
и её значение удаляется после выхода из функции. У меня вместо 5 выводит 100.

Потерю данных можно избежать если использовать статические переменные или указатели,
но вспомним основы: статические переменные хранятся в памяти до завершения приложения,
а с указателями нужно быть внимательным и не забывать очищать память, или приложение
за час и больше работы может занять 1 и больше Гб ОЗУ.

Пример с указателем:
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
using namespace std;
 
int& func();
 
int main()
{
    int* b = &func();
    cout << b << endl;
    cout << *b << endl;
    delete b;
    
    return 0;
}
 
int& func()
{
    int *a = new int;
    *a = 5;
    return *a;
}

Вообще указатели это очень классная штука, учись работать с ними.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru