Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Сравнить переменные https://www.cyberforum.ru/ cpp-beginners/ thread568537.html
Всем доброго времени суток, подскажите как сравнить 5 целочисленных переменных и большую из них распечатать?
C++ ООП
1) Для класса символьной строки определить отношение лексикографического порядка, перегрузив с помощью дружественной функции операцию «<» 2)9. Рациональное число определить как несократимую дробь,...
C++ повернуть массив
Привет всем, ребят помогите написать программу - нужно массив повернуть на 45, 90, 180, 360 градусов и распечатать полученные результаты.
C++ Оператор (-) Унарный минус. классы. Доброе время суток . помогите . составить operator- (унарный минус) ( что бы координаты x и y были отрицательными .( немогу понять как это сделать .. И как ввести новые координаты x и y то... https://www.cyberforum.ru/ cpp-beginners/ thread568525.html
C++ Как улучшить код?! https://www.cyberforum.ru/ cpp-beginners/ thread568507.html
Написал код к заданию: Дан целочисленный массив размера N. Если он является перестановкой, то есть содержит все числа от 1 до N, то вывести 0, в противном случае вывести номер первого недопустимого...
Заданы 3 целых числа, отсортировать в порядке возрастания. C++
Задание: Задано три целых числа. Необходимо вывести их в порядке возрастания. Числа не превышают 109 по модулю. Входные данные: Три числа, разделенные пробелом. Выходные данные: Три числа в...
C++ деструктор по умолчанию
Всем привет. Хотелось бы обсудить такой код: class A { }; class B: virtual public A { }; class C: public virtual A
C++ Отсортировать массив в порядке возрастания до первого максимального Здравствуйте. Нужно отсортировать массив в порядке возрастания элементов до первого максимального. #include "stdafx.h" #include <iostream> #include <conio.h> #include <stdlib.h> using... https://www.cyberforum.ru/ cpp-beginners/ thread568491.html
C++ запись в word,excel https://www.cyberforum.ru/ cpp-beginners/ thread568482.html
можно ли записывать данные вместо .тхт файла в word или excel?
C++ 2 маленькие задачки на массивы 1.в массиве поменять max и min элемент и вывести массив до перемещения и после 2.посчитать количество четных элементов стоящих на нечетных местах https://www.cyberforum.ru/ cpp-beginners/ thread568480.html
Заблокирован
08.05.2012, 14:39 0

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

08.05.2012, 14:39. Просмотров 2456. Ответов 5
Метки (Все метки)

Ответ

Цитата Сообщение от 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); уже не получится. Функция, ожидающая ссылку, будет ожидать только реально существующий объект.

А это - превентивная защита функции от дурака. Что бы все подряд в неё не пихали.

Вернуться к обсуждению:
Зачем нужна ссылка в конструкторе копирования
1
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.05.2012, 14:39
Готовые ответы и решения:

Ссылка rvalue в конструкторе копирования и операторе присваивания
Здравствуйте. Решил попробовать ссылки rvalue в классе. Привожу часть: \\BinaryArray.h ...

О конструкторе копирования
Доброго времени суток всем присутствующим. Интересует маленький вопрос. В 15-й строке происходит...

Ошибка в конструкторе копирования
Всем привет, не могу понять проблему, у меня есть структура: struct WindowRender : public...

Ошибка в конструкторе копирования C++
Помогите, пожалуйста создать конструктор копирования, который будет копировать элемент и добавлять...

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