С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 21, средняя оценка - 4.67
VLK
194 / 163 / 12
Регистрация: 05.05.2013
Сообщений: 1,196
#1

Передача в функцию - ссылки, указатели, константы - C++

16.06.2013, 23:18. Просмотров 3064. Ответов 37
Метки нет (Все метки)

Вот программа:

Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream> 
 
 void fun(int &rhs) 
{
rhs++;
}
 
int main()
{
int var = 2;
        
fun(var);
 
std::cout << var << "\n";
    
system("pause");
return 0;
}


В строке 10 я создаю переменную var и присваиваю ей значение 2, т.е. допустим по адресу 0001 у меня располагается значение 2
В строке 12 я передаю var в виде ссылке в функцию, где она получает новое имя (временное имя, псевдоним) - rhs, значение rhs располагается по тому же адресу что и var - 0001.
В строке 5 я прибавляю 1 к rhs и по адресу 0001 меняется значение с 2 на 3.

по этому в строке 14 мне выведет на экран 3, а не 2.

Вопрос, а что происходит, как работает следующая программа:

Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream> 
 
 int & fun(int rhs) 
{
rhs++;
 
return rhs;
}
 
int main()
{
int varOne = 2;
int varTwo;
        
varTwo = fun(varOne);
 
std::cout << varTwo << "\n";
    
system("pause");
return 0;
}


В частности меня интересует какую роль выполняет оператор & в строке 3 и чем отличается такая же программа без &.

Распишите по возможности так, как я описывал первую программу, что бы не оставалось вопрос, что бы не пришлось переспрашивать.

Это первый вопрос в этой теме, дальше я буду добавлять вопросы, про указатели константы и т.д. так что если что, смотрите последние сообщения, а не первое.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.06.2013, 23:18
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Передача в функцию - ссылки, указатели, константы (C++):

Передача в функцию константы вместо указателя - C++
Копаясь в чужом коде, обнаружил для себя странность в вызове функции. В C++ я разбираюсь слабо. Функция (точнее метод класса)...

Ссылки и указатели на функцию - C++
Если передавать значение в функцию через указатель и ссылку,то в обоих случаях передаётся адрес,а не значение? И ещё: int *...

Как лучше передавать значения в функцию? Ссылки vs указатели - C++
Всем доброго времени суток. Уважаемые гуру, подскажите пожалуйста, как лучше передавать значения в функцию, через указатель или ссылку? И...

Передача массива в функцию (указатели) - C++
Возникла проблема. Написала программу решение систем линейных уравнений методом Гаусса. В студии 12 года работает правильно, а в 13 нет;...

Передача в функцию через указатели - C++
Компилятор говорит, что что-то не так с передачей max и min. Что? #include &lt;stdio.h&gt; #include &lt;iostream&gt; #include &lt;string.h&gt; ...

Передача двумерного массива в функцию через указатели - C++
поставлена такая задача - Реализовать функцию перемножения двумерных матриц bool Multi-plyMatrices(int** matrixA, int aRows, int aCols,...

37
Olivеr
412 / 408 / 13
Регистрация: 06.10.2011
Сообщений: 832
17.06.2013, 19:16 #16
Цитата Сообщение от VLK Посмотреть сообщение
21
Оператор присвоения. Зачем возвращать копию если можно и нужно возвращать ссылку? Объект то, на который ссылается ссылка, существует.

Цитата Сообщение от VLK Посмотреть сообщение
17
Оператор []. Предназначен для получения доступа к элементу последовательности. Почему ссылка? 1. Он существует даже после завершения функции. 2. Что бы работала запись:
C++
1
2
string str = "123";
str[1] = '1'; //113
Думаю очевидно, что str[1] вернет ссылку на char

Цитата Сообщение от VLK Посмотреть сообщение
этот пример из книги
Не все примеры в книгах являются корректными. Многие из них приведены для того что бы объяснить на пальцах почему так делать не стоит.

Цитата Сообщение от VLK Посмотреть сообщение
но не работает строчка1 = строчк2 + строчка3 и я думаю проблема как раз кроется в этих строчках 17 и 21, но я их не понимаю по этому не могу толком найти проблему.
В вашей программе не перегружен оператор +
0
VLK
194 / 163 / 12
Регистрация: 05.05.2013
Сообщений: 1,196
19.06.2013, 13:24  [ТС] #17
Я примерно понял что же все же означает эта & в данном случае.

Новый вопрос по данной теме, теперь про константы, подскажите, что делает ключевое слово const и с кем, с чем, в каждом конкретном случае:

1. const int fun (int var) { }
2. int const fun (int var) { }
3. int fun (int var) const { }

4. int fun (const int var) { }
5. int fun (int const var) { }
0
Olivеr
412 / 408 / 13
Регистрация: 06.10.2011
Сообщений: 832
19.06.2013, 13:44 #18
Цитата Сообщение от VLK Посмотреть сообщение
1. const int fun (int var) { }
2. int const fun (int var) { }
3. int fun (int var) const { }
4. int fun (const int var) { }
5. int fun (int const var) { }
1 и 2 - одно и тоже: возвращают константную копию переменной типа int
3. возвращает копию переменной типа int. указатель this - константый
4 и 5. принимает константную копию переменной типа int и возвращает копию переменной типа int
1
Jupiter
Каратель
Эксперт С++
6561 / 3982 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
19.06.2013, 13:44 #19
Цитата Сообщение от VLK Посмотреть сообщение
1. const int fun (int var) { }
2. int const fun (int var) { }
эти две записи означают одно и тоже, возвращение константы, какого-то особого смысла в этом нет
Цитата Сообщение от VLK Посмотреть сообщение
4. int fun (const int var) { }
5. int fun (int const var) { }
эти две записи означают одно и тоже, var внутри функции ведет себя как константа
Цитата Сообщение от VLK Посмотреть сообщение
3. int fun (int var) const { }
такая запись допустима только для методов класса.
означает она то что этот метод класса не модифицирует состояние объекта.
внутри такого метода нельзя модифицировать поля класса, за исключением полей объявленных как mutable.
но эти оганичения можно обойти с помощью const_cast, но если такое потребовалось то вы явноно что-то делаете не так.
1
VLK
194 / 163 / 12
Регистрация: 05.05.2013
Сообщений: 1,196
19.06.2013, 14:20  [ТС] #20
Цитата Сообщение от Jupiter Посмотреть сообщение
эти две записи означают одно и тоже, возвращение константы, какого-то особого смысла в этом нет
т.е., вот есть небольшая программа:
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream> 
 
int const fun  ( int  D) 
{
D = 8;
return D;
}
 
int main()
{
int varOne = 5;
int varTwo = 0;
 
varTwo = fun(varOne);
 
std::cout << varTwo << "\n";
 
system("pause");
return 0;
}

Есть 2 переменных - varOne, допустим она находится по адресу 0001 и varTwo которая находится по адресу 0002, когда начинается выполнение функции (fun) то мы создаем копию переменной varOne, имя этой копии D и располагается она по адресу 0003, и то, что мы возвращаем является константным значением, т.е. переменная расположенная по адресу 0003 является константной, но она становится константной только тогда когда мы ее возвращаем, т.е. до строчки 6 (return D) я могу с этим D делать все что угодно, а далее, в строчках 7 и 14 переменная расположенная в 0003 является константной, соответственно после строчки 14 переменная по адресу 0003 будет уничтожена, по этому данная запись бесполезна?

Цитата Сообщение от Jupiter Посмотреть сообщение
эти две записи означают одно и тоже, var внутри функции ведет себя как константа
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream> 
 
int fun  (int const  D) 
{
D = 8;
return D;
}
 
int main()
{
int varOne = 5;
int varTwo = 0;
 
varTwo = fun(varOne);
 
std::cout << varTwo << "\n";
 
system("pause");
return 0;
}


Тут как я понимаю в строчке 3 D присваивается значение 5 и внутри функции я его не могу менять, т.е. на строчке 5 мне выдаст ошибку.


Цитата Сообщение от Jupiter Посмотреть сообщение
такая запись допустима только для методов класса.
означает она то что этот метод класса не модифицирует состояние объекта.
внутри такого метода нельзя модифицировать поля класса
А с вот этим бы хотелось уточнить т.е. если у меня есть переменная-член var и функция int fun (int var) const { } должна ее изменить, допустим прибавить 1 к ней, то эта функция не будет работать, компилятор выдаст ошибку?

Добавлено через 11 минут
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream> 
 
class mat
{
public:
mat(): var(0) {}
mat(int rhs): var(rhs) {}
~mat() {}
 
void set_var(int rhs) {var = rhs;}
int get_var() {return var;}
 
int plus_odin() const { var++; return var; }
 
private:
int var;
};


Вот дописал программу - класс, как я понимаю строка 13 ошибочная из-за const.
0
Jupiter
Каратель
Эксперт С++
6561 / 3982 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
19.06.2013, 15:17 #21
Цитата Сообщение от VLK Посмотреть сообщение
Есть 2 переменных - varOne, допустим она находится по адресу 0001 и varTwo которая находится по адресу 0002, когда начинается выполнение функции (fun) то мы создаем копию переменной varOne, имя этой копии D и располагается она по адресу 0003, и то, что мы возвращаем является константным значением, т.е. переменная расположенная по адресу 0003 является константной, но она становится константной только тогда когда мы ее возвращаем, т.е. до строчки 6 (return D) я могу с этим D делать все что угодно, а далее, в строчках 7 и 14 переменная расположенная в 0003 является константной, соответственно после строчки 14 переменная по адресу 0003 будет уничтожена, по этому данная запись бесполезна?
да

Цитата Сообщение от VLK Посмотреть сообщение
компилятор выдаст ошибку?
возьми да проверь, что за манера спрашивать то что можно узнать самому
Кликните здесь для просмотра всего текста
да, выдаст


Добавлено через 31 секунду
Цитата Сообщение от VLK Посмотреть сообщение
Вот дописал программу - класс
программа не класс
1
MrGluck
Модератор
Эксперт CЭксперт С++
7498 / 4614 / 694
Регистрация: 29.11.2010
Сообщений: 12,636
19.06.2013, 15:50 #22
Тут уже озвучили, что привязка временного объекта к ссылке на const в стеке продлевает время жизни объекта на время существования данной ссылки?
Т.е.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
 
int fun(int rhs)
{
    rhs++;
 
    return rhs;
}
 
int main()
{
    int varOne = 2;
 
    const int& varTwo = fun(varOne);
 
    std::cout << varTwo << "\n";
 
    return 0;
}
абсолютно корректно. А вот то, что привел Olivеr настоящий UB, просто по счастливой случайности данные в том участке памяти, где сидела локальная переменная не изменились. Ну вроде это уже и без меня озвучили, мне поворчать охота)
0
ninja2
231 / 187 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
19.06.2013, 15:51 #23
C++
1
int & fun(int rhs) { rhs++; return rhs; }
int& означает что ты возвращает ссылку на локальную переменную которая создана в функции rhs.
0
Olivеr
412 / 408 / 13
Регистрация: 06.10.2011
Сообщений: 832
19.06.2013, 16:19 #24
Цитата Сообщение от MrGluck Посмотреть сообщение
абсолютно корректно. А вот то, что привел Olivеr настоящий UB, просто по счастливой случайности данные в том участке памяти, где сидела локальная переменная не изменились. Ну вроде это уже и без меня озвучили, мне поворчать охота)

Не по теме:

Так это ж в учебных целях.
VLK никак не понимал, что происходит когда возвращается ссылка. И я уже писал, что ссылка на временный объект - плохая примета



Добавлено через 4 минуты
Цитата Сообщение от MrGluck Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
 
int fun(int rhs)
{
    rhs++;
 
    return rhs;
}
 
int main()
{
    int varOne = 2;
 
    const int& varTwo = fun(varOne);
 
    std::cout << varTwo << "\n";
 
    return 0;
}
Корректен, но здесь будет копирование.
0
VLK
194 / 163 / 12
Регистрация: 05.05.2013
Сообщений: 1,196
19.06.2013, 16:33  [ТС] #25
Цитата Сообщение от Olivеr Посмотреть сообщение
И я уже писал, что ссылка на временный объект - плохая примета
Ну что я могу сделать, если почти в каждом примере в книге по которой я учусь (опустим тот момент хорошая она или плохая, и стоит ли мне учится тогда по другой книге, сойдемся на том, что я ее более менее понимаю) есть подобные записи типа int & fun(int rhs)
0
MrGluck
Модератор
Эксперт CЭксперт С++
7498 / 4614 / 694
Регистрация: 29.11.2010
Сообщений: 12,636
19.06.2013, 16:52 #26
VLK, будете прекрасно проходить быдлокод, а потом потратите в 3 раза больше сил на то, чтобы переучиться. Читайте нормальную литературу. Дейтелов "Как программировать на С++", Страуструпа, на крайний случай "С++ для чайников", она правда старовата уже, но их всех книг, что я читал, там самым понятным текстом объясняется. После неё все же стоило бы прочитать одного из кандидатов выше.

А книгу сжечь, проведя ритуальные танцы вокруг костра с отбивкой в барабан, ожерельем из кокосов и перьями индейцев на голове.
1
VLK
194 / 163 / 12
Регистрация: 05.05.2013
Сообщений: 1,196
19.06.2013, 22:57  [ТС] #27
Я изначально учил по книге Дейтелов "Как программировать на С++" - все закончилось печально, я не понимал половину того, что там пишут, и чем дальше, тем больше эта половина превращалось во "все".
Сейчас изучаю по книге Джесс Либерти - Освой самостоятельно C++ за 21 день, там 90% материала написано доступно.

И по поводу переучивания, лично я когда закончу с Джесс Либерти, еще раз все повторю, закреплю по книгам Страуструпа, хотя говорят что если ты разбираешься в C++, то все равно сложно понять что пишет этот Страуструп, если не получится по нему то по Дейтелу.
0
Jupiter
Каратель
Эксперт С++
6561 / 3982 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
19.06.2013, 23:08 #28
Цитата Сообщение от VLK Посмотреть сообщение
Сейчас изучаю по книге Джесс Либерти - Освой самостоятельно C++ за 21 день, там 90% материала написано доступно.
если бы было доступно, то не возникло бы вопросов
0
ninja2
231 / 187 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
19.06.2013, 23:14 #29
Цитата Сообщение от VLK Посмотреть сообщение
И по поводу переучивания, лично я когда закончу с Джесс Либерти, еще раз все повторю, закреплю по книгам Страуструпа, хотя говорят что если ты разбираешься в C++, то все равно сложно понять что пишет этот Страуструп, если не получится по нему то по Дейтелу.
Да Страуструпа не бери 100% не пойдет, лучше уже после Дейтелов. Да лучше Дейтелов книги по С++ я еще не видел. (Хотя я только одну книгу по С++ прочитал Дейтела )
Да Дейтелы золотая книга я самостоятельно по ней разобрался и очень все хорошо описано, да и примеры кода нормальные.
0
xtorne21st
интересующийся
304 / 275 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
19.06.2013, 23:19 #30
ninja2, у Дейтелов, насколько я помню, нет описания виртуальных функций...
0
19.06.2013, 23:19
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.06.2013, 23:19
Привет! Вот еще темы с ответами:

Указатели и массивы. Передача массива в функцию по указателю - C++
Как передать массив в функцию,которая должна заполнить этот массив ? Вот,что я составил, но компилятор ругается: #include &quot;stdafx.h&quot; ...

Передача ссылки на массив в функцию - C++
запутался в 3 соснах... Помахайте плиз) //обьявляю и инициализирую функцию void fShow(char *pNameArray){ for (int i = 0; i &lt;...

Передача ссылки и указателя в функцию - C++
передал ссылку в одну функцию - нормально, передал в другую - выводит неверное значение, тоже самое с указателем. Как можно это исправить?

Передача ссылки на обьект класса в функцию - C++
Определен класс в хэддере: class List{ public: //... void Add(const List *list); //... Метод Add:


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

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

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