Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Передача объектов функциям (Указатели), Различия 
V
    Опции темы
Marlin
Дата 20.11.2006, 06:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 170
Регистрация: 20.2.2006

Репутация: нет
Всего: 1



Есть по крайней мере два способа выполнения этой задачи. Результат один и тот же. Хотел бы узнать все же их различия, а также как работать правильнее.

Пример 

Вызов функции с передачей указателя

Код

#include <stdio.h>
#include <iostreara.h>

class Student
(
public:
    int semesterHours;
    float gpa;
    float addCourse(int hours, float grade){return 0.0};
};
void someFn(Student* pS)
{
    pS->semesterHours = 10;
    p5->gpa = 3.0;
    pS->addCourse (3, 4.0);
}
int main(int argc, char* pArgs[])
{
    Student s;
    Student* pS;
    pS = s&;
    someFn(pS);
    return 0;
}


Передача объекта по ссылке

Код


void someFn(Student& refS)
{
refS.semesterHours = 10;
refS.gpa = 3.0;
refS.addCourse(3, 4.0); 
}
Student s;

int main(int argc, char* pArgs[])
{
someFn(s);
return 0;
}

]



Это сообщение отредактировал(а) Marlin - 20.11.2006, 06:45
--------------------
Программист решает проблемы, о которых пользователь даже не задумывается,способами, о котороых он даже не подозревает.
PM MAIL   Вверх
archimed7592
Дата 20.11.2006, 07:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



разницы практически нет. точнее говоря, на низком уровне её совсем нет. на уровне языка - не нужно писать * для ссылки, но в качестве ссылки нельзя передать нулевой указатель...хотя...возможно все:
Код
someFn (*(Student *) NULL);
но это уже больше извращение и в случае ссылки ты можешь считать, что объект точно существует...


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
Kuvaldis
Дата 20.11.2006, 09:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


механик-вредитель
***


Профиль
Группа: Участник Клуба
Сообщений: 1189
Регистрация: 16.6.2006
Где: Минск

Репутация: 11
Всего: 61



Marlin, 
Не знаю, специально получилось у тебя или нет, но:
Код

public:    
    int semesterHours;    
    float gpa;

не есть гуд.
Ты нарушаешь концепцию ООП: даные должны быть скрыты (в секции private) и должен быть предоставлен интерфейс (методы) для доступа и (если надо) изменения этих данных.


archimed7592, 
Надеюсь, что это не злостный оффтопик
Цитата

разницы практически нет. точнее говоря, на низком уровне её совсем нет.

Давно хотел узнать, да забывал: как РЕАЛЬНО физически реализуется механизм ссылок. Пользоваться умею, плюсы и минусы, нюансы знаю. Но помнится, преподы, кроме слов, что "ссылка - это псевдоним", больше ничего не говорили. Да и в книжках подробно не встречал...
В общем был бы рад услышать ответ или link на ресурс... (я не нашел)

Это сообщение отредактировал(а) Kuvaldis - 20.11.2006, 09:42


--------------------
Помни - когда ты спишь, враг не дремлет
Спи чаще и дольше, изматывай врага бессоницей
PM MAIL ICQ   Вверх
SergeCpp
Дата 20.11.2006, 10:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


 
**


Профиль
Группа: Участник
Сообщений: 955
Регистрация: 8.8.2005
Где: At Home

Репутация: 15
Всего: 124



user posted image

5.5 References

The obvious implementation of a reference is as a (constant) pointer that is dereferenced each
time it is used. It doesn’t do much harm thinking about references that way, as long as one remembers
that a reference isn’t an object that can be manipulated the way a pointer is.

In some cases, the compiler can optimize away a reference so that there is no object representing
that reference at runtime.



Это сообщение отредактировал(а) SergeCpp - 20.11.2006, 10:32
PM MAIL WWW ICQ   Вверх
UnrealMan
Дата 20.11.2006, 10:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 722
Регистрация: 30.3.2006

Репутация: 27
Всего: 32



Цитата(archimed7592 @  20.11.2006,  07:52 Найти цитируемый пост)
в случае ссылки ты можешь считать, что объект точно существует... 

Как и указатель, ссылка тоже может быть невалидной.

Цитата(Kuvaldis @  20.11.2006,  09:41 Найти цитируемый пост)
Давно хотел узнать, да забывал: как РЕАЛЬНО физически реализуется механизм ссылок. 

Зависит от реализации и места использования. Например, внутри класса

Код
struct A
{
    A(int n, int &ref) : n(n), ref(ref) {}
private:
    int n;
    int &ref;
};

это, вероятно, будет то же самое, что и указатель, только операции с таким указателем будут иметь семантику ссылок. А, скажем, где-нибудь внутри функции

Код
void Func()
{
    int n;
    int &ref = n;
    ref = 3;
}

вместо ref, вероятно, будет подставлено само n.

Вообще реализация ссылок, скорее всего, будет такой же, как и у указателей: там, где в принципе оптимизация позволяет напрямую использовать объект, либо указатель на него, ссылка, вероятно, будет заменена на прямое обращение, в противном случае вероятно ожидать реализации ссылки в виде отдельно хранящегося адреса.
PM MAIL   Вверх
Earnest
Дата 20.11.2006, 10:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 53
Всего: 183



Ссылки реализуются через указатели.
Разница только на уровне семантики. Ссылка - это указатель и разыменование в одном флаконе. Т.е. передается как указатель, а используется (в вычислениях) как объект. Ссылка не может быть неинициализированной (компилятор не пропустит) и всегда связана с одним и тем же объектом (нельзя переставить на другой). А указатель, соответственно, можно. 
В смысле использования - в зависимости от вкуса\привычек\обстоятельств. Как уже было сказано, передавая ссылку, ты как бы гарантируешь, что объект обязан быть. Рекомендации, ИМХО, такие: использоваться ссылки везде, где это возможно. Если невозможно - заменять указателями. 
Хотя есть случаи, когда указателями пользоваться удобнее: скажем, при использовании шаблонов типа boost::bind: Компилятор не может отличить передачу ссылки от передачи объекта, так что во избежания лишних копирований приходится использовать boost::ref (если хочешь передать ссылку). А при передаче указателя - никаких проблем и лишних слов.


--------------------
...
PM   Вверх
Marlin
Дата 20.11.2006, 13:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 170
Регистрация: 20.2.2006

Репутация: нет
Всего: 1



Цитата

Ты нарушаешь концепцию ООП: даные должны быть скрыты (в секции private) и должен быть предоставлен интерфейс (методы) для доступа и (если надо) изменения этих данных.


Это всего лишь учебный пример
--------------------
Программист решает проблемы, о которых пользователь даже не задумывается,способами, о котороых он даже не подозревает.
PM MAIL   Вверх
Marlin
Дата 20.11.2006, 13:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 170
Регистрация: 20.2.2006

Репутация: нет
Всего: 1



Короче подвожу итоги:

т.е в примере 1 "Вызов функции с передачей указателя" я могу передать в функцию все что угодно, любой из объявленных экземпляров класса, не инициализировать его и передать в функцию. В итоге в программе появиться "бяка", которую я долго и муторно буду искать.

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

Я так понял, в создании классов лучше пользоваться ссылками, дабы обезопасить класс от ошибок, да и вообще, код лучше читаться будет.

Earnest – все объяснил толково, в точку, без лишней воды не по теме. 

--------------------
Программист решает проблемы, о которых пользователь даже не задумывается,способами, о котороых он даже не подозревает.
PM MAIL   Вверх
archimed7592
Дата 20.11.2006, 22:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



Цитата(UnrealMan @  20.11.2006,  11:27 Найти цитируемый пост)
Как и указатель, ссылка тоже может быть невалидной.
угу. я даже показал пример, как этого можно добиться...только вот указатель намного проще сделать (сам того не подозревая) невалидным...




--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
vinter
Дата 20.11.2006, 22:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 13
Всего: 56



Цитата

Earnest – все объяснил толково, в точку, без лишней воды не по теме. 

объяснила  smile 


--------------------
Мой блог
PM MAIL WWW   Вверх
likehood
Дата 20.11.2006, 23:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


666
**


Профиль
Группа: Участник
Сообщений: 536
Регистрация: 21.12.2005

Репутация: 8
Всего: 24



Цитата(archimed7592 @  20.11.2006,  23:04 Найти цитируемый пост)
угу. я даже показал пример, как этого можно добиться...

а можно ссылочку?
PM MAIL   Вверх
archimed7592
Дата 21.11.2006, 00:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



Цитата(baronp @  21.11.2006,  00:20 Найти цитируемый пост)
а можно ссылочку?
на здоровье smile


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
UnrealMan
Дата 21.11.2006, 11:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 722
Регистрация: 30.3.2006

Репутация: 27
Всего: 32



Цитата(archimed7592 @  20.11.2006,  22:04 Найти цитируемый пост)
угу. я даже показал пример, как этого можно добиться...

Плохо показал... У тебя идёт разыменование нулевого указателя, результат выполнения которого не определён. Иными словами, не факт, что ты где-то сумеешь использовать такую «ссылку» – до этого дело может просто не дойти.

Цитата(archimed7592 @  20.11.2006,  22:04 Найти цитируемый пост)
только вот указатель намного проще сделать (сам того не подозревая) невалидным...

Ну, не знаю. Обычно причиной невалидности указателя является уничтожение объекта, на которого он указывает, но это верно и в отношении ссылок (т.н. «висячие» ссылки). Можно, конечно, ещё вспомнить выход за границы массива, но это уже будет связано с арифметикой указателей, поэтому проводить тут сравнения со ссылками бессмысленно.

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0691 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.