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

Копирующий конструктор - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 42, средняя оценка - 4.67
BTR
 Аватар для BTR
8 / 8 / 1
Регистрация: 01.11.2010
Сообщений: 157
14.01.2011, 20:03     Копирующий конструктор #1
Здравствуйте, кто нибудь может сказать, почему при создании копирующего конструктора нужно указывать ссылку на объект?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <string>
using namespace std;
 
 
 
class DArray {
public:
    friend void copyConstruct(DArray da);
    DArray(int nLengthOfArray = 0) : nLength(nLengthOfArray), pArray(nullptr) 
    {
        cout << "Создание DArray размером" << nLength << endl;
        if(nLength > 0) {
            pArray = new int[nLength];
        }
    
    }
    DArray(DArray& duhas) {
        cout << "Копирование DArray размером" << duhas.nLength << endl;
        copyDArray(duhas);
    }
protected:
    int nLength;
    int* pArray;
    void copyDArray(const DArray& da);
    void deleteDArray();
};
 
void copyConstruct(DArray da) {
 
}
 
 
int main(int argc, char** argv) {
    setlocale(0,"Russian");
    // Объявляем объект класса DArray
    DArray da(58);
    copyConstruct(da);
 
 
    system("pause >> void");
    return 0;
}
Просто не могу понять, почему нельзя без ссылке в классе в копирующем конструкторе объявить объект, понять интересно, заранее спасибо
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
lemegeton
 Аватар для lemegeton
2909 / 1338 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
14.01.2011, 20:15     Копирующий конструктор #2
Такой формат копирующего конструктора.
Цитата Сообщение от BTR Посмотреть сообщение
Просто не могу понять, почему нельзя без ссылке в классе в копирующем конструкторе объявить объект, понять интересно
Магистра Йоды тайна речи известна стала?
Можно объявлять совсем без конструктора копирования. Гугл, например, вообще рекомендует не делать такие конструкторы.
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
15.01.2011, 01:31     Копирующий конструктор #3

Не по теме:

Цитата Сообщение от lemegeton Посмотреть сообщение
Гугл, например, вообще рекомендует не делать такие конструкторы
А что он рекомендует, если мне надо создать копию объекта? Или позарез надо передать в функцию объект по значению?



Добавлено через 2 минуты
BTR, ссылку надо указывать потому, что если вы будете передавать объект по значению, то для него при передаче будет вызван копирующий конструктор. Т.е. получится бесконечная рекурсия (для того, чтобы вызвать копирующий конструктор, нужно в него передать копию объекта, а чтобы её создать, нужно вызвать копирующий конструктор).

Добавлено через 1 минуту
Цитата Сообщение от BTR Посмотреть сообщение
Просто не могу понять, почему нельзя без ссылке в классе в копирующем конструкторе объявить объект
Ну объявите вы объект. В копирующем конструкторе. И что? Этот пустой объект будете копировать? Какая же это тогда копия?
lemegeton
15.01.2011, 01:46
  #4

Не по теме:

Цитата Сообщение от silent_1991 Посмотреть сообщение
А что он рекомендует, если мне надо создать копию объекта? Или позарез надо передать в функцию объект по значению?
В первом случае сделать метод CopyFrom(ClassName &source), во втором случае сделать клон и передать по ссылке или указателем. Ну и это, в конце-концов не правило, а настойчивая рекомендация, позволяющая избежать ошибок. В некоторых классах по смыслу без копирования не обойтись.

Цитата Сообщение от silent_1991 Посмотреть сообщение
Ну объявите вы объект. В копирующем конструкторе. И что? Этот пустой объект будете копировать? Какая же это тогда копия?
О, я смотрю, месьё поднатарел в криптографии... Я только приблизительный смысл фразы ТС понял. Хотя у меня давно на хрустальный шар гарантия вышла.

silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
15.01.2011, 01:54     Копирующий конструктор #5

Не по теме:

Цитата Сообщение от lemegeton Посмотреть сообщение
О, я смотрю, месьё поднатарел в криптографии

Если я, конечно, правильно понял смысл фразы, то ответ будет таки, какой я дал. А если не правильно, то хренова ещё моя криптография



Добавлено через 2 минуты
Цитата Сообщение от lemegeton Посмотреть сообщение
В некоторых классах по смыслу без копирования не обойтись
Ну в них, собственно, по-моему, и надо писать копирующие конструкторы. А в других да, можно обойтись и без них. Я вообще придерживаюсь такого правила - если в классе есть указатель и динамическое выделение памяти под него - надо писать конструктор копии.
Yandex
Объявления
15.01.2011, 01:54     Копирующий конструктор
Ответ Создать тему
Опции темы

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