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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.86
programina
1916 / 601 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
#1

Указатели или ссылки (в качестве аргументов функции) ? - C++

23.05.2013, 10:23. Просмотров 2068. Ответов 55
Метки нет (Все метки)

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

Нюансы синтаксиса и семантики: ссылки, указатели и массивы в качестве аргументов функций - C++
Перенесено из этой темы. Чтобы вернуть указатели почему вот здесь не надо приводить janr к типу указателя char* на выходе? char*...

Указатели на массивы в качестве аргументов - C++
Помогите пожалуйста а то вообще идей никаких нет( Напишите функцию поиска минимального элемента в динамическом двухмерном массиве...

Константные указатели в качестве аргументов функций - C++
Вскрылся вот такой пробел в знаниях/понимании. Итак, есть предположим однонаправленный список (в общем без разницы что). struct TNode {...

С++ Тема «Указатели и динамические массивы. Использование указателей в качестве аргументов функций» - C++
В целочисленном массиве Х(N) удалить все элементы, расположенные между макси-мальным и минимальным элементами. Найти среднее арифметическое...

Идентификаторы списка в качестве аргументов функции - C++
Хочу организовать поиск по списку с помощью функции, в которую бы передавались: поле, по которому искать (собсно какая-то переменная из...

Использование массивов в качестве аргументов функции - C++
Написала программу, работает правильно, только не совсем по условию задачи. Помоги пожалуйста исправить. Условие: найти наибольшую...

55
programina
1916 / 601 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
24.05.2013, 08:10  [ТС] #16
а еще вот видела недавно такой пример:
C++
class cObj
{
public:
    int a;
    
    cObj operator + (cObj &);
};
 
cObj cObj::operator + (cObj & obj)
{
    cObj tmp; // это хорошо так делать?
    tmp.a = a + obj.a;
    return tmp;
}
 
int main()
{
    cObj x;
    cObj y;
 
    x.a = 4;
    y.a = 3;
 
    cout << (x + y).a << endl;
}
Добавлено через 12 минут
ред.

Добавлено через 12 минут
C++
// или лучше так:
cObj() {}
cObj(int a) { this->a = a; }
 
// ...
 
cObj cObj::operator + (cObj & obj)
{
    return cObj(this->a + obj.a);
}
0
Jupiter
Каратель
Эксперт С++
6564 / 3985 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
24.05.2013, 09:36 #17
Цитата Сообщение от programina Посмотреть сообщение
// это хорошо так делать?
Цитата Сообщение от programina Посмотреть сообщение
// или лучше так:
да один фиг, нормальный компилятор с включенными оптимизациями сгенерирует одинаковый код в обоих случаях
1
oxotnik
1591 / 1068 / 33
Регистрация: 21.08.2008
Сообщений: 4,467
Записей в блоге: 1
24.05.2013, 09:41 #18
Цитата Сообщение от programina Посмотреть сообщение
// или лучше так:
С указателем использование этого класса менее читабельным будет.
Ну и в перегрузке операторов приянто использовать константную ссылку.
1
programina
1916 / 601 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
24.05.2013, 09:46  [ТС] #19
я просто боюсь, что локальное создание обьекта tmp может отразиться на быстродействии программы
0
oxotnik
1591 / 1068 / 33
Регистрация: 21.08.2008
Сообщений: 4,467
Записей в блоге: 1
24.05.2013, 10:04 #20
Цитата Сообщение от programina Посмотреть сообщение
я просто боюсь, что локальное создание обьекта tmp может отразиться на быстродействии программы
А какой тогда смысл у operator+ в первом примере, если он не изменяет сам класс?
По логике вещей вот так надо переписать:
C++
1
2
3
4
5
cObj cObj::operator + (const cObj & obj)
{
    a += obj.a;
    return (*this);
}
1
taras atavin
3571 / 1755 / 91
Регистрация: 24.11.2009
Сообщений: 27,567
24.05.2013, 10:08 #21
Цитата Сообщение от programina Посмотреть сообщение
если окажется, что ссылка есть копия обьекта?
Ссылка не может быть копией, это гарантировано стандартом.
0
Jupiter
Каратель
Эксперт С++
6564 / 3985 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
24.05.2013, 10:14 #22
Цитата Сообщение от oxotnik Посмотреть сообщение
C++
1
2
3
4
5
cObj cObj::operator + (const cObj & obj)
{
   a += obj.a;
   return (*this);
}
только модифицировать ничего не надо
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
//member function
cObj& cObj::operator += (const cObj & right)
{
     a += right.a;
     return *this;
}
 
//free function
cObj operator + (const cObj & left, const cObj & right)
{
    cObj res(left);
    return res += right;
}
2
alsav22
5429 / 4824 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
24.05.2013, 10:14 #23
Цитата Сообщение от oxotnik Посмотреть сообщение
А какой тогда смысл у operator+ в первом примере, если он не изменяет сам класс?
Это уже перегрузка +=. При сложении значения слагаемых не изменяются.
2
taras atavin
3571 / 1755 / 91
Регистрация: 24.11.2009
Сообщений: 27,567
24.05.2013, 10:14 #24
Цитата Сообщение от programina Посмотреть сообщение
Что значит "альтернативное имя" - это скопированный обьект или указатель на одну и тут же область памяти?
Ссылка-параметр - указатель на ту же память, остальные ссылки могут быть реализованы тремя способами: или как синтаксическая надстройка над указателем, или на этапе компиляции как связанная строчка в таблице переменных, или опять же на этапе компиляции как запись в дополнительном столбце имён переменных. Она в любом случае сошлётся на ту же память, но обращение по ссылке, не являющейся параметром, может быть оттранслировано и во фрагмент кода, полностью идентичный обращению к той же памяти по имени самой переменной, а не ссылки на неё, стандарт иного не гарантирует.
1
ForEveR
В астрале
Эксперт С++
7985 / 4744 / 321
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
24.05.2013, 10:14 #25
oxotnik, Чего? Оператор + НЕ должен изменять сам класс. Оператор += должен.
2
taras atavin
3571 / 1755 / 91
Регистрация: 24.11.2009
Сообщений: 27,567
24.05.2013, 10:17 #26
ForEveR, а Вам не приходило в голову задуматься о причинах ошибок и глюков даже в ОО-проектах? В частности о причинах знаменитой утечки памяти?
1
oxotnik
24.05.2013, 10:20
  #27

Не по теме:

звиняйте, бес попутал

1
ForEveR
В астрале
Эксперт С++
7985 / 4744 / 321
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
24.05.2013, 10:25 #28
taras atavin, Это вы о чем глаголите? О том, что оператор + должен изменять объект?
0
taras atavin
3571 / 1755 / 91
Регистрация: 24.11.2009
Сообщений: 27,567
24.05.2013, 10:30 #29
Цитата Сообщение от ForEveR Посмотреть сообщение
Это вы о чем глаголите? О том, что оператор + должен изменять объект?
О том, что при всех Ваших стараниях всё равно найдутся деятели, запутывающие исходник путём перегрузок оператора +, делающих то, что должен делать +=, а то и *=. Именно они и пишут глючно.
0
programina
1916 / 601 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
24.05.2013, 10:45  [ТС] #30
Цитата Сообщение от oxotnik Посмотреть сообщение
C++
1
2
3
4
5
cObj cObj::operator + (const cObj & obj)
{
    a += obj.a;
    return (*this);
}
Кстати в том примере, который я видела, оператор присваивания реализован именно так.
0
24.05.2013, 10:45
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.05.2013, 10:45
Привет! Вот еще темы с ответами:

Ostream и ofstream в качестве аргументов полиморфной функции - C++
Здравствуйте! Перегрузил оператор &lt;&lt; с ostream и ofstream для пользовательского класса. ofstream &amp;operator &lt;&lt; (ofstream &amp;output,...

Написать программу с использованием функции, которая сравнивает две строки, заданные в качестве её аргументов - C++
Написать программу с использованием функции, которая сравнивает две строки, заданные в качестве её аргументов. Если аргумент только один,...

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

Дан файл, переписать его в обратном направлении, передавая имена файлов в качестве аргументов функции main - C++
Здравствуйте! Помогите, пожалуйста! Дан файл, переписать его в обратном направлении, передавая имена файлов в качестве аргументов функции...


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

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

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