Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
programmeri
3 / 3 / 1
Регистрация: 11.12.2012
Сообщений: 41
#1

Функция возвращает не ссылку а само значение переменной на которое оно ссылается - C++

25.08.2014, 23:35. Просмотров 611. Ответов 20
Метки нет (Все метки)

Скажите пожалуйста есть функция `
C++
1
int& my(){return a}
которая возвращает ссылку если возвращаемое функцией значение присвоить переменной должно ведь сохраняться ссылка на него, вместо этого функция возвращает не ссылку а само значение переменной на которое оно ссылается
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.08.2014, 23:35
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Функция возвращает не ссылку а само значение переменной на которое оно ссылается (C++):

Функция возвращает ссылку
Вот пример программы какой смысл здесь возвращать ссылку? И вообще не могу...

Функция возвращает константную ссылку
Можно ли в таком случае возвращать константную ссылку? Не будет никакой...

Функция возвращает ссылку на статический массив
Мне необходимо чтобы массив pol и mas были обязательно статическими, но...

Функция, которая возвращает слово в строке, которое короче всех.
Добрый день уважаемые программисты! Есть задание: Написать функцию, которая...

Функция find принимает вектор и число, которое ищется и возвращает указатель на найденное число
здравствуйте. подскажите есть вот такая задача //Написать ф-цию find, которая...

Функция не возвращает значение
Функция ничего не возвращает: int Return(int s) { return s; } Передаю...

20
-NEURON-
Заблокирован
25.08.2014, 23:45 #2
programmeri, программина ?
код вызова покажи
P.S.: ссылка это и есть значение грубо гоовря
0
John Prick
831 / 764 / 256
Регистрация: 27.07.2012
Сообщений: 2,176
Завершенные тесты: 3
25.08.2014, 23:53 #3
programmeri, приведи пример хотя бы компилируемой функции.
Возвращать ссылки на локальные объекты функции чревато крахом программы.
Цитата Сообщение от -NEURON- Посмотреть сообщение
P.S.: ссылка это и есть значение грубо гоовря
Ссылка - это ссылка. Совершенно разные вещи возвращать объект по ссылке или по значению.
1
-NEURON-
Заблокирован
25.08.2014, 23:55 #4
Цитата Сообщение от John Prick Посмотреть сообщение
Ссылка - это ссылка.
ссылка, это тот же указатель, только с авто разименованием
1
John Prick
26.08.2014, 00:01
  #5

Не по теме:

Судя по всему, смайлик намекает на ненужность серьёзной дискуссии по этой теме.

0
-NEURON-
26.08.2014, 00:02
  #6

Не по теме:

Цитата Сообщение от John Prick Посмотреть сообщение
Судя по всему, смайлик намекает на ненужность серьёзной дискуссии по этой теме.
именно :)

0
programmeri
3 / 3 / 1
Регистрация: 11.12.2012
Сообщений: 41
26.08.2014, 00:04  [ТС] #7
Я имел виду почему функция вместо того чтобы вернуть адрес возвращает значение ?
0
John Prick
831 / 764 / 256
Регистрация: 27.07.2012
Сообщений: 2,176
Завершенные тесты: 3
26.08.2014, 00:05 #8
programmeri, потому что ссылка - это не адрес.
1
-NEURON-
Заблокирован
26.08.2014, 00:07 #9
Википедия:
С точки зрения реализации, ссылка — это, по сути, указатель, который жестко привязан к области памяти, на которую он указывает, и который автоматически разыменовывается, когда мы обращаемся по имени ссылки
https://ru.wikipedia.org/wiki/%D1%F1%FB%EB%EA%E0_(C++)
1
programmeri
3 / 3 / 1
Регистрация: 11.12.2012
Сообщений: 41
26.08.2014, 00:08  [ТС] #10
А все понятно

Добавлено через 22 секунды
спасибо +1
0
-NEURON-
Заблокирован
26.08.2014, 00:14 #11
от меня: ссылка, это как бы альтернативное имя переменной, по сути - та же переменная, ну как бы просто второе имя указывающее на тот же блок памяти. Другое дело, как уже намекали, если ты создаёшь переменную внутри функции и возвращаешь на неё ссылку, то есть фактический после выхода за границы функции, если статическая переменная, то сразу получишь аксес виолейшен при обращение к ссылке, т.к. она после выхода из функции самоуничтожится. Если создашь динамический - будет всё ок, только не забывай потом удалять память, вызывая delete по адресу ссылки.
0
John Prick
831 / 764 / 256
Регистрация: 27.07.2012
Сообщений: 2,176
Завершенные тесты: 3
26.08.2014, 00:35 #12
Цитата Сообщение от -NEURON- Посмотреть сообщение
Если создашь динамический - будет всё ок, только не забывай потом удалять память, вызывая delete по адресу ссылки.
Не вводи человека в заблуждение:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <iostream>
#include <stdlib.h>
 
class Class
{
public:
    Class(void) { std::cout << "create Class\n"; }
};
 
Class & create_class_ref(void) { return *(new Class); }
Class * create_class_ptr(void) { return new Class; }
 
int main(void)
{
    Class * a = create_class_ptr();
    Class * pa = a;
    delete pa; // OK!
    system("pause");
 
    Class & c = create_class_ref();
    Class * pc = &c;
    delete pc; // OK!
    system("pause");
 
    Class b = create_class_ref();
    Class * pb = &b;
    delete pb; // Oops!
    system("pause"); 
    return 0;
}
Добавлено через 3 минуты
Это я к тому, что возвращать ссылку на объект, созданный в функции динамически - ужасное решение.

Добавлено через 1 минуту
Цитата Сообщение от -NEURON- Посмотреть сообщение
если статическая переменная, то сразу получишь аксес виолейшен при обращение к ссылке, т.к. она после выхода из функции самоуничтожится.
Как раз таки, если локальная переменная объявлена статической (static), то ссылку на неё можно спокойно возвращать.
0
programmeri
3 / 3 / 1
Регистрация: 11.12.2012
Сообщений: 41
26.08.2014, 00:39  [ТС] #13
Нет я ссылаюсь на Глобальную переменную
0
-NEURON-
Заблокирован
26.08.2014, 00:40 #14
Цитата Сообщение от John Prick Посмотреть сообщение
Как раз таки, если локальная переменная объявлена статической (static)
)) Как будто ты не понял о чём я

Цитата Сообщение от John Prick Посмотреть сообщение
Не вводи человека в заблуждение:
У-тю-пу-тю А кто вводит - то ?
Вот как надо:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <tchar.h>
 
int& Test();
 
int _tmain(int argc, _TCHAR* argv[])
{
    int &a = Test();
    a = 666;    
    delete &a;
    return 0;
}
 
int& Test()
{
    return *(new int);
}
0
programmeri
3 / 3 / 1
Регистрация: 11.12.2012
Сообщений: 41
26.08.2014, 00:41  [ТС] #15
Вот код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
using namespace std;
int a = 100;
int &func()
main()
{
 
}
int &func()
{
return a;
}
0
-NEURON-
Заблокирован
26.08.2014, 00:43 #16
Цитата Сообщение от John Prick Посмотреть сообщение
Class b = create_class_ref();
* * Class * pb = &b;
* * delete pb; // Oops!
а тут надо объявлять ссылку на класс, а не статический объект, что упса не было.
Class b = create_class_ref(); должно быть Class &b = create_class_ref();

Добавлено через 54 секунды
programmeri, что ты хочешь нам сказать этим бессмысленным кодом ?
0
John Prick
831 / 764 / 256
Регистрация: 27.07.2012
Сообщений: 2,176
Завершенные тесты: 3
26.08.2014, 00:45 #17
Цитата Сообщение от -NEURON- Посмотреть сообщение
Вот как надо:
Угу. Только никто не мешает не поставить & перед именем переменной и таким образом потерять выделенную память навсегда.
Цитата Сообщение от -NEURON- Посмотреть сообщение
Как будто ты не понял о чём я
Я-то понял. Понял ли ТС?
0
programmeri
3 / 3 / 1
Регистрация: 11.12.2012
Сообщений: 41
26.08.2014, 00:47  [ТС] #18
Это не мой код его написал тот кто учит таких как ты программированию Шилдт
0
-NEURON-
Заблокирован
26.08.2014, 00:49 #19

Не по теме:

Цитата Сообщение от John Prick Посмотреть сообщение
Угу. Только никто не мешает не поставить & перед именем переменной и таким образом потерять выделенную память навсегда.
ну так это ж С++, а не детсадовский шарп, тут думать надо :)



Добавлено через 14 секунд

Не по теме:

Цитата Сообщение от John Prick Посмотреть сообщение
Я-то понял. Понял ли ТС?
хз :)



Добавлено через 1 минуту
Цитата Сообщение от programmeri Посмотреть сообщение
Это не мой код его написал тот кто учит таких как ты программированию Шилдт
Ну и что? Вот ты приводишь кусок кода, надо же наверное задать вопрос какой -то? Ну или сказать - посмотрите - какой чудный у меня код !
0
John Prick
831 / 764 / 256
Регистрация: 27.07.2012
Сообщений: 2,176
Завершенные тесты: 3
26.08.2014, 00:51 #20
Цитата Сообщение от programmeri Посмотреть сообщение
Это не мой код его написал тот кто учит таких как ты программированию Шилдт
programmeri, в коде, который ты привёл нет ничего криминального. Только я вот что-то не помню, чтобы Шилдт или кто-то там ещё учил грубости.
0
26.08.2014, 00:51
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.08.2014, 00:51
Привет! Вот еще темы с решениями:

Функция get() не возвращает значение
Есть класс, в котором определен объект типа SDL_Surface*. Пытаюсь передать его...

Функция не возвращает значение
#include &lt;iostream&gt; #include &lt;fstream&gt; #include &lt;iomanip&gt; #include...

Функция не возвращает значение
#include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;conio.h&gt; using namespace...

Функция возвращает неверное значение
Здравствуйте. Подскажите, пожалуйста, почему одна из двух функций возвращает...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

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