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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.82
titans2011
294 / 255 / 43
Регистрация: 27.09.2010
Сообщений: 1,058
#1

Зачем нужна ссылка в конструкторе копирования - C++

08.05.2012, 13:10. Просмотров 1405. Ответов 5
Метки нет (Все метки)

Вопрос такой, Зачем нужна ссылка в конструкторе копирования? Почему не передавать напр. по указателю?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.05.2012, 13:10     Зачем нужна ссылка в конструкторе копирования
Посмотрите здесь:

C++ Параметр в конструкторе копирования
C++ Ошибка в конструкторе копирования класса
Ошибка в конструкторе копирования C++
C++ О конструкторе копирования
C++ В конструкторе копирования отцовского (_str) класса возникает некое "необработанное исключение"
C++ Указатель this в конструкторе копирования
C++ С какой целью необходимо передвать по ссылке переменную в конструкторе копирования?
C++ Можно ли в конструкторе копирования поменять один параметр?
Ссылка rvalue в конструкторе копирования и операторе присваивания C++
C++ Объясните, зачем в коде нужен явный конструктор копирования
Исправить ошибку в конструкторе копирования пользовательского класса Sort C++
C++ константная ссылка в качестве аргумента конструктору копирования

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alex_x_x
бжни
2443 / 1648 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
08.05.2012, 14:05     Зачем нужна ссылка в конструкторе копирования #2
потому что так удобнее
не нужно производить лишних движений для получения адреса
Bers
Заблокирован
08.05.2012, 14:39     Зачем нужна ссылка в конструкторе копирования #3
Цитата Сообщение от titans2011 Посмотреть сообщение
Вопрос такой, Зачем нужна ссылка в конструкторе копирования? Почему не передавать напр. по указателю?
Потому что "ссылка" - псевдоним имени объекта. Или по другому - указатель на реально существующий объект. А указатель - это просто переменная, содержащая адрес объекта (при этом не важно, существует ли сам объект, и что вообще находится по факту по этому адресу).

Предположим, что копирующий конструктор принимает указатель, а не ссылку, тогда на псевдокоде это выглядело бы вот так:

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
struct STest
{
    STest(int val) {}
    STest(const STest* ptr) {}
};
 
int main()
{
    STest test = 0; //что здесь должно запуститься? 
                   //Конструктор, принимающий число ноль?
                   //или конструктор копии, 
                   //принимающий нулевой адрес?
 
    return 0;
}
В примере выше, закомментируем все, кроме конструктора копии, тогда:

C++ (Qt)
1
2
3
4
5
int main()
{
    STest test = 0; //Объект будет построен, как копия "нуля"
    return 0;
}
Где здравый смысл? Как может объект быть построен, как копия какого то нуля?
По смыслу, копирующий конструктор берёт реально существующий объект, и делает его точную копию. Объект не может быть копией какого то числа. Иначе, это уже не копирующий конструктор.


Рассмотрим другой пример:

C++ (Qt)
1
2
3
4
5
//ожидает на входе реальный объект
void Foo( CSome& some); 
 
//допускает, что на входе будет Foo(NULL);
void Foo( CSome* some);
Если тебе нужно работать именно с конкретным реально-существующим объектом, то ты работаешь с ссылками.

Если же, тебя интересует не столько сам объект, сколько именно адрес этого объекта (ну или вообще адрес, и при этом допускается, что объекта по факту может и не существовать), то ты работаешь с указателями.

В первом случае, сделать Foo(NULL); уже не получится. Функция, ожидающая ссылку, будет ожидать только реально существующий объект.

А это - превентивная защита функции от дурака. Что бы все подряд в неё не пихали.
alex_x_x
бжни
2443 / 1648 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
08.05.2012, 15:02     Зачем нужна ссылка в конструкторе копирования #4
Цитата Сообщение от Bers Посмотреть сообщение
В первом случае, сделать Foo(NULL); уже не получится. Функция, ожидающая ссылку, будет ожидать только реально существующий объект.
да ладно
C++
1
2
3
4
5
6
7
8
9
struct Foo {
  void crash () { std::cout << data << std::endl; }
  int data;
};
 
int main() {
  Foo& f = *((Foo*)NULL);
  f.crash();
}
Toshkarik
1139 / 856 / 51
Регистрация: 03.08.2011
Сообщений: 2,383
Завершенные тесты: 1
08.05.2012, 15:11     Зачем нужна ссылка в конструкторе копирования #5
Да и в первом случае все будет работать и вызовется конструктор принимающий целочисленный тип.
Bers
Заблокирован
08.05.2012, 16:35     Зачем нужна ссылка в конструкторе копирования #6
Цитата Сообщение от alex_x_x Посмотреть сообщение
да ладно
Искусственный метод отстрелить себе ногу.

C++
1
2
CSome* ptr;
ptr->Method(); //trollolo
Си/с++ языки раздолбаев. Позволяют совершать многие глупые, бессмысленные вещи, ага.
Yandex
Объявления
08.05.2012, 16:35     Зачем нужна ссылка в конструкторе копирования
Ответ Создать тему
Опции темы

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