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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 42, средняя оценка - 4.67
BTR
8 / 8 / 1
Регистрация: 01.11.2010
Сообщений: 157
#1

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

14.01.2011, 20:03. Просмотров 5178. Ответов 4
Метки нет (Все метки)

Здравствуйте, кто нибудь может сказать, почему при создании копирующего конструктора нужно указывать ссылку на объект?
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;
}
Просто не могу понять, почему нельзя без ссылке в классе в копирующем конструкторе объявить объект, понять интересно, заранее спасибо
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.01.2011, 20:03
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Копирующий конструктор (C++):

копирующий конструктор !!! - C++
Вот это верный вид конструктора копирования??? class VK{ int b; public: VK(const VC &amp;); } VL::VK(const VK &amp; tmp){ b=tmp.b; ...

Копирующий конструктор - C++
Помогите пожалуйста реализовать копирующий конструктор, у меня он выдает нули =\ Вот код: #include &lt;iostream&gt; #include...

Копирующий конструктор - C++
Добрый вечер всем! Следущая проблема - решила создать свой персональный vector - int_array. Но возникла проблема... Не пойму, как...

Копирующий конструктор - C++
#include&lt;iostream&gt; #include&lt;fstream&gt; #include&lt;sstream&gt; #include&lt;cmath&gt; #include&lt;cstdlib&gt; #include&lt;string&gt; #include&lt;limits&gt; ...

копирующий конструктор и иерархия - C++
Создать иерархию типов, описывающую - студента, отца семейства и студента-отца семейства. Классы должны конструкторы, включая конструктор...

Закрытый копирующий конструктор - C++
В данном упражнении описана методика, которая может помочь отказаться от копирующих конструкторов. Создайте класс Х и объявите (но не...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
lemegeton
2924 / 1353 / 135
Регистрация: 29.11.2010
Сообщений: 2,725
14.01.2011, 20:15 #2
Такой формат копирующего конструктора.
Цитата Сообщение от BTR Посмотреть сообщение
Просто не могу понять, почему нельзя без ссылке в классе в копирующем конструкторе объявить объект, понять интересно
Магистра Йоды тайна речи известна стала?
Можно объявлять совсем без конструктора копирования. Гугл, например, вообще рекомендует не делать такие конструкторы.
1
silent_1991
Эксперт С++
4964 / 3040 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
15.01.2011, 01:31 #3

Не по теме:

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



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

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

Не по теме:

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

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

1
silent_1991
Эксперт С++
4964 / 3040 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
15.01.2011, 01:54 #5

Не по теме:

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

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



Добавлено через 2 минуты
Цитата Сообщение от lemegeton Посмотреть сообщение
В некоторых классах по смыслу без копирования не обойтись
Ну в них, собственно, по-моему, и надо писать копирующие конструкторы. А в других да, можно обойтись и без них. Я вообще придерживаюсь такого правила - если в классе есть указатель и динамическое выделение памяти под него - надо писать конструктор копии.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.01.2011, 01:54
Привет! Вот еще темы с ответами:

Копирующий конструктор абстрактного класа - C++
Добрый вечер. Сразу к делу. Есть абстрактный класс: class Product abstract { protected: int lipids; string brand; ...

Когда в классе нужен копирующий конструктор? - C++
Меня интересует вопрос когда в классе нужен копирующий конструктор.

Копирующий конструктор в списке инициализации членов класса - C++
Добрый день. Сегодня обнаружил кое-что для себя странное и непонятное. В общем-то смотрим код: #include &lt;iostream&gt; ...

Копирующий конструктор класса, содержащего переменную-член указатель - C++
Практикуюсь по книге Стенли Липпмана &quot;Язык программирования C++ вводный курс&quot; 4 изд. Упражнение 13.4. Используя приведенный ниже набросок...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
15.01.2011, 01:54
Ответ Создать тему
Опции темы

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