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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
KrisV
0 / 0 / 0
Регистрация: 31.03.2010
Сообщений: 36
#1

Возврат ссылки из функции - C++

19.04.2010, 10:34. Просмотров 816. Ответов 8
Метки нет (Все метки)

Изучаю С++, знаю С. Вот такой простенький вопросик есть.

В чем вообще разница:

C++
1
2
3
4
5
6
7
8
9
class Str {
public:
    Str func() {return *this;};
};
и
class Str {
public:
    Str & func() {return *this;};
};
Оба вырианта компилятор переваривает на ура.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.04.2010, 10:34
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Возврат ссылки из функции (C++):

Создание ссылки и возврат из функции - C++
Есть вот такая функция, возвращает максимальный элемент. template <typename Type> inline const Type max_(const Type& a, const Type& b) ...

Возврат константной ссылки из функции - C++
Можно ли из функции возвращать константную ссылку? Есть след. классы: class A { /*чтото тяжёлое, сотни байт, например массив, или...

Возврат ссылки - C++
Задача которая считывает массив и определяет минимальный, макисмальный, первый отрицательный элемент, и их индексы. По заданию надо ее...

Возврат ссылки - C++
int & function(int); Понятно для чего передают аргументы в функцию как указатели или ссылки.Но зачем функция возвращает ссылку? Чтобы...

Возврат ссылки на функцию. - C++
Здравствуйте, можете пожалуйста объяснить чем отличается когда функция создается просто каким то типом, и когда она создается ссылкой на...

Возврат ссылки на локальную переменную - C++
Привет, есть такой код: int*& change(void) { int* x(new int(50)); return x; } int main(void) {

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
oxotnik
1589 / 1066 / 33
Регистрация: 21.08.2008
Сообщений: 4,545
Записей в блоге: 1
19.04.2010, 10:43 #2
в 1-м случае передача идет по значению (создается новый объект)
во 2-м по ссылке (объект не создается, а ему назначается альтернативное имя)
KrisV
0 / 0 / 0
Регистрация: 31.03.2010
Сообщений: 36
19.04.2010, 12:03  [ТС] #3
Передача по значению - это я так понимаю при передачи в функцию.., а что имеетс в виду если речь о возвращаемом значении?
А пример использования, демонстрирующий разницу, можешь дать?
oxotnik
1589 / 1066 / 33
Регистрация: 21.08.2008
Сообщений: 4,545
Записей в блоге: 1
19.04.2010, 12:15 #4
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
void func1(string arg)
{
    arg = "some string1";
}
void func2(string &arg)
{
    arg = "some string1";
}
 
int main ()
{
    string str = "some string"
    func1(str);
    // str здесь будет содержать старое значение "some string"
    func2(str);
    // str здесь будет содержать новое значение "some string1"
    return 0;
}
KrisV
0 / 0 / 0
Регистрация: 31.03.2010
Сообщений: 36
19.04.2010, 12:23  [ТС] #5
Не если это параметр функции то все абсолютно ясно, интересует если возвращаемое значение.
Maxim Prishchepa
Эксперт С++
1922 / 1034 / 74
Регистрация: 29.03.2010
Сообщений: 3,167
19.04.2010, 12:38 #6
если я всё правильно понимаю, то примером может быть примерно следующий код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
int& myFunc(int &val)
{
    val+=20;
    return val;
}
int main(int argc, char *argv[])
{
    int i=0;
    int *ptrToI = &myFunc(i);
    int valueInI = *ptrToI;
    cout<<valueInI;
}
Vourhey
Почетный модератор
6478 / 2253 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
19.04.2010, 12:41 #7
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
#include<iostream>
 
class Str {
public:
    Str func() {return *this;};
public:
    int a;
};
 
class Str2 {
public:
        Str2 & func() {return *this;};
public:
    int a;
};
 
 
int main(){
    Str a;
    Str b = a.func();
    b.a = 10;
    std::cout<<a.a<<"   "<<b.a<<std::endl;
 
    Str2 a2;
    Str2 &b2 = a2.func();
    b2.a = 10;
    std::cout<<a2.a<<"   "<<b2.a<<std::endl;
    return 0;
}
-1074295272 10
10 10
oxotnik
1589 / 1066 / 33
Регистрация: 21.08.2008
Сообщений: 4,545
Записей в блоге: 1
19.04.2010, 13:44 #8
Цитата Сообщение от KrisV Посмотреть сообщение
Не если это параметр функции то все абсолютно ясно, интересует если возвращаемое значение.
ну какбе при ссылке возвращать ту же переменную нет смысла, ибо она передается не по значению, т.е. работа происходит с тем же самым объектом, просто ему внутри назначается альтернативное имя.

для примера класс с перегруженным оператором []
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
class CSomeClass
{
private:
    vector<int> array;
public:
    CSomeClass()
        {
             for (int i= 0; i <100; i++)
                  array.push_back(i);
        }
    int & operator [] (const int index)
    {
        return array[index];
    }
};
 
int main()
{
    CSomeClass sc;
    cout<<sc[88]<<endl;
    sc[88] = 10;
    cout<<sc[88]<<endl;
    return 0;
}
Maxim Prishchepa
Эксперт С++
1922 / 1034 / 74
Регистрация: 29.03.2010
Сообщений: 3,167
19.04.2010, 13:49 #9
как вариант, может потребоваться возвращать из функции ссылку, если Вы выделяете в функции память, и за функцией требуется работать, с выделенной областью (могу глупость сказать :-))
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.04.2010, 13:49
Привет! Вот еще темы с ответами:

operator= возврат значения и просто ссылки - C++
Здорова господа! Снова пытаюсь чуток в С++ разобраться, с перегрузкой операций, снова ничерта непонятно. от допустим класс class...

Возврат ссылки на закрытый элемент данных с++ - C++
Я не могу понять как устроена проблема с возвратом ссылки на закрытый элемент данных.class Time{ public: int &amp;badSetHour(int hh){ ...

Возврат 2 значений из функции с одним вызовом этой же функции - C++
Вообщем где то в какой то игре была хукнута одна функция int function(int arg1,int arg2,int arg3); суть в чем int...

Возврат итератора из функции - C++
в чем заключается проблема с возвратом итератора и как ее исправить? заранее спасибо за ответ =) (ожидаемый от программы ответ &quot;Yes&quot;,...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
19.04.2010, 13:49
Ответ Создать тему
Опции темы

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