Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

OOP. References.

7.8K
08 сентября 2006 года
littlefrankie
57 / / 23.08.2006
Сразу извиняюсь, если вопрос ламерский, но я пока что не особо силен в ООП. кто знает, в чём отличие ссылок от указателей? В одной книге прочитал, что "reference is an alias to variable". Ну и что? Не может же быть единственным отличием то, что со ссылочной переменной синтаксис тот же, что и с обычной, а с указателем надо использовать операторы * и -> . При написании copy-constructor разве нельзя его объявить как myclass(const myclass *defmc)?
14K
08 сентября 2006 года
wrap
35 / / 02.06.2006
Ссылка по сути является указателем на переменную, для которой она объявлена. При каждом обращении к переменной посредством ссылки происходит неявное разыменование этого указателя. Эффект такой же как и при обращении по указателю. Разница в том, что при обращении по указателю приходится его разыменовывать явно, т.е. используя операторы * и ->.
Если объявить конструктор копирования так, как предлагаешь ты, придется писать код так:
 
Код:
myclass   Var1;  // конструктор по умолчанию
myclass   Var2 = Var1; //  в случае конструктора копирования myclass(const myclass &);
myclass   Var2 = &Var1; // твой конструктор
350
08 сентября 2006 года
cheburator
589 / / 01.06.2006
[QUOTE=littlefrankie]Сразу извиняюсь, если вопрос ламерский, но я пока что не особо силен в ООП. кто знает, в чём отличие ссылок от указателей? В одной книге прочитал, что "reference is an alias to variable". Ну и что? Не может же быть единственным отличием то, что со ссылочной переменной синтаксис тот же, что и с обычной, а с указателем надо использовать операторы * и -> . При написании copy-constructor разве нельзя его объявить как myclass(const myclass *defmc)?[/QUOTE]
Синтаксис такой же, как и при работе с непосредственно переменной, а физически ссылка есть указатель. Т. е. ссылка - это неявный указатель.
В чем преимущества перед передачей самих значений и перед передачей указателя?
1. Передавать по ссылке удобнее, чем указатель, т. к. легче писать a вместо *a, или a.x() вместо a->x().
2. Передавать по ссылке быстрее и компактнее, чем саму переменную, т. к. физически происходит передача указателя, который обычно имеет строго фиксированный размер независимо от объекта, на который он указывает. Естественно, лучше передать 4 байта адреса на объект, чем передавать копию очень большого объекта.
3. Передача по ссылке некоторого значения в функцию позволяет изменять это значение внутри функции, причем изменяться будет оригинал значения, а не его копия, как в случае с передачей по значению. Вот, к примеру
Код:
void plus (int a, int b)
{
  a += b;
}

void plus1 (int &a, int b)
{
  a += b;
}

void main (void)
{
  int variable = 5;
  plus (variable, 2);
  cout << variable;  // Будет выведено 5
  plus1 (variable, 2);
  cout << variable;  // Будет выведено 7
}

Как видим, вызов функции plus не повлиял на значение передаваемой переменной variable, т. к. при её вызове фактически создается копия переменной и функция изменяет эту копию, оставляя оригинал неизменным. А функция plus1 в качестве параметра берет ссылку на эту переменную и через эту ссылку изменяет оригинальное значение.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог