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

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

Войти
Регистрация
Восстановить пароль
 
 
mzarb
-211 / 7 / 1
Регистрация: 14.01.2013
Сообщений: 141
#1

Почему допустимо создавать объект по другому объекту, но нельзя присваивать уже созданный объект, другому созданному объекту? - C++

18.01.2013, 00:05. Просмотров 1015. Ответов 22
Метки нет (Все метки)

Это можно :
C++
1
2
3
Array a(10);
a.set(0,5);
Array b(a);
А это нельзя :
C++
1
2
3
Array a(10);
Array b(20);
a = b;
Объясните пожалуйста в чем дело. Если можно, то поподробней, то есть что именно копируется, с каких мест и когда. Я только знаю, что в первом варианте можно так делать, потому что объект ещё не создан, а тонкостей не знаю(.
Вот полный код :
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
class Array {
private:
    size_t mysize;
    int *mydata;
public:
    Array(size_t size);
    void set(int i, int val);
    int get(int i);
};
 
Array::Array(size_t size){
    mysize = size;
    mydata = new int [mysize];
}
 
void Array::set(int i, int val){
    mydata[i] = val;
}
 
int Array::get(int i){
    return mydata[i];
}
 
int main() {
    Array a(10);
    a.set(0,7);
    Array b(a); //Первый вариант
    
    Array a(10);
    Array b(20);
    b=a;        //Второй вариант
    return 0;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.01.2013, 00:05
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Почему допустимо создавать объект по другому объекту, но нельзя присваивать уже созданный объект, другому созданному объекту? (C++):

Почему конструктор вызывается при присвоении объекта другому объекту - C++
оператор+ выполняется нормально, но когда уже переменная в sum, на след шаге она вызывает конструктор, ибо у меня в примере 9 выходит. А в...

как присвоить значения из одного объекта другому объекту - C++
у меня два объекта, мне надо присвоить значения из одного объекта другому объекту, как это можно сделать #include <iostream> using...

Указатель на целочисленный объект. Указать возможные способы доступа к этому объекту. - C++
здарвствуйте все! помогите пожалуйста с заданиями по мере возможностей: 2) Определив указатель на целочисленный объект, укажите возможные...

Классы. Доступ к созданному объекту. - C++
Доброе утро, форум.:friends: Имеется код, чисто для примера. файл book.h #ifndef BOOK_H #define BOOK_H struct Book {

выделить место для объекта с помощью new или создать указатель, объект и присвоить один другому. какая разница? - C++
кроме того что к объекту созданному с помощью new можно будет обращаться только через указатель.

Правильно созданный глобальный объект - C++
Необходимо создать создать несколько объектов классов глобально. Я делаю: Создаю h-файл. в нем объявляю(создаю) объекты. И в срр -...

22
Jupiter
Каратель
Эксперт С++
6561 / 3982 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
19.01.2013, 02:37 #16
Цитата Сообщение от mzarb Посмотреть сообщение
Почему конструктор вызывается бесконечно, если в его параметр передать объект по значению, то есть не по ссылке Array(Array &a), а по значению Array(Array a). Не важно, что это не работает.
все что передается по значению копируется,
копии объектов классов конструируются конструктором копирования,
потому если конструктор копирования принимал бы параметр по значению то и возникла бы бесконечная рекурсия
1
mzarb
-211 / 7 / 1
Регистрация: 14.01.2013
Сообщений: 141
19.01.2013, 02:46  [ТС] #17
Jupiter, а как бы тогда выглядела реализация такого такого конструктора копирования?
0
Jupiter
Каратель
Эксперт С++
6561 / 3982 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
19.01.2013, 02:51 #18
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
//copy c-tor
Array::Array(const Array& other)
{
    mysize = other.mysize;
    mydata = new int[mysize];
    
    for (int i = 0; i < mysize; ++i)
        mydata[i] = other.mydata[i];
}
 
//assignment operator
Array& Array::operator = (const Array& other)
{
    if (this != other)
    {
         delete [] mydata;
         mysize = other.mysize;
         mydata = new int[mysize];
    
         for (int i = 0; i < mysize; ++i)
             mydata[i] = other.mydata[i];
    }
    return *this;
}
1
mzarb
-211 / 7 / 1
Регистрация: 14.01.2013
Сообщений: 141
19.01.2013, 03:16  [ТС] #19
Jupiter, спасибо! Хотелось бы уточнить ещё один момент.
Цитата Сообщение от Jupiter Посмотреть сообщение
все что передается по значению копируется,
копии объектов классов конструируются конструктором копирования,
потому если конструктор копирования принимал бы параметр по значению то и возникла бы бесконечная рекурсия
То есть до исполнения тела конструктора копий так и не дойдет?
0
Jupiter
Каратель
Эксперт С++
6561 / 3982 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
19.01.2013, 04:03 #20
Цитата Сообщение от mzarb Посмотреть сообщение
То есть до исполнения тела конструктора копий так и не дойдет?
в неправильном варианте - не дойдет
1
mzarb
-211 / 7 / 1
Регистрация: 14.01.2013
Сообщений: 141
19.01.2013, 13:11  [ТС] #21
Jupiter, я вас уже наверное достал, но можно последний вопрос? То есть, если бы конструктор копий принимал параметр по значению, то после Array b(a) выполнение бы пошло сразу в конструктор копий Array(Array c), который принимает параметр по значению, то есть ему нужно копировать объект, а что бы копировать объект, ему нужно запустить конструктор копий, то есть ещё раз Array(Array c) Array(Array c) и т.д. Правильно ли это?
0
DU
1484 / 1130 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
19.01.2013, 13:12 #22
да. так оно и есть.
1
mzarb
-211 / 7 / 1
Регистрация: 14.01.2013
Сообщений: 141
19.01.2013, 13:36  [ТС] #23
Всем спасибо! И отдельное спасибо Jupiter за помощь и хорошее объяснение.
0
19.01.2013, 13:36
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.01.2013, 13:36
Привет! Вот еще темы с ответами:

Как правильно вернуть объект созданный в функции? - C++
Допустим у нас есть функция, которая динамически создает объект и должна его вернуть. К примеру, возьмем динамическое создание массива. ...

Как возвратить указатель на объект, созданный в методе? - C++
A* B::ReturnPtrA(){ A a; a.Method1(a.Method2()); //... return &amp;a; } Говорит, что нельзя возвращать указатель...

Как обратиться к созданному объекту, если переменной присвоен уже другой объект? - Visual Basic
Всем привет, Допустим, у меня есть класс, назовем его MyClass. Я объявляю переменную x, затем присваиваю ей новый созданный объект на...

Как прикрепить линию к объекту и провести к другому объекту ? - Unity, Unity3D
Привет. Вот вариант с помощью метода Gizmos.DrawLine. Как видите линия проходит с центра одного объекта в центр другого. Но задумка...


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

Или воспользуйтесь поиском по форуму:
23
Ответ Создать тему
Опции темы

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