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

Конструктор копирования(быстрый вопрос) - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.80
cetrael
 Аватар для cetrael
60 / 5 / 3
Регистрация: 01.10.2011
Сообщений: 93
28.11.2011, 02:09     Конструктор копирования(быстрый вопрос) #1
Вроде бы все просто и логично, но в итоге выполнения B не копируется в A :C why?
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
#include <iostream>
 
using namespace std;
 
class Int {
    int a;
public:
    Int() {a = 0;}
    Int(int A)  {a = A;}
    int getA() const { return a; }
 
    Int& operator = (const Int &obj) {
        int a;
        a = obj.a;
        return *this;
    }
 
    Int(const Int& obj) {
        int a = 0;
        a = obj.a;
    }
 
};
 
int main () {
 
 
    Int A(1);
    Int B(A);
    cout << B.getA();//Ожидал увидеть 1, а получается что-то типа -8589......
        Int C(12);
        C = A;
        cout << C.getA();//Ожидал увидеть тоже 1, а получается 12, то есть значение не изменилось.
 
 
 
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.11.2011, 02:09     Конструктор копирования(быстрый вопрос)
Посмотрите здесь:

C++ Конструктор копирования
конструктор копирования C++
Конструктор копирования C++
C++ конструктор копирования
Конструктор копирования C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
greeezz
272 / 165 / 4
Регистрация: 10.07.2011
Сообщений: 441
28.11.2011, 18:17     Конструктор копирования(быстрый вопрос) #21
Deviaphan, Сыроежка, Вы все правильно говорите, но вы по всей видимости отвлекаетесь от того что мы тут не реализацию класса int на все случаи жизни обсуждаем. Автор темы попросил помочь в одной конкретной задаче.

Сыроежка, компилятор вообще много чего оптимизирует, но этот факт не прибавляет знаний начинающим программистам.
А const нужен для того ("инцидента") чтобы автор темы не прошел мимо и при тестировании увидел разницу между:
(A = B) = C
и :
A = B = C
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Bers
Заблокирован
28.11.2011, 18:19     Конструктор копирования(быстрый вопрос) #22
greeezz, есть конкретная задача. Её нужно решить. Ничего другого в рамках заданного контекста не существует.
greeezz
28.11.2011, 18:31
  #23

Не по теме:

Bers, конкретная задача в имени темы. так же как и вы смотрите на теги форматирования, я сотрю на то что просит автор темы и не более того.

Bers
28.11.2011, 23:00
  #24

Не по теме:

Цитата Сообщение от greeezz Посмотреть сообщение
Bers, конкретная задача в имени темы. так же как и вы смотрите на теги форматирования, я сотрю на то что просит автор темы и не более того.
Ну вот вы внимательно прочли, что просит автор, и поняли, что у автора какая то там трудность с копирующим конструктором. И поэтому вы решили сделать класс, у которого вообще нет явного копирующего конструктора?

Ну типа... нет конструктора - нет проблем?

И кстати, вопрос на засыпку:
Зачем классу может понадобится явный оператор=, если ему не нужен явный копирующий конструктор?

Сыроежка
Заблокирован
28.11.2011, 23:30     Конструктор копирования(быстрый вопрос) #25
Цитата Сообщение от greeezz Посмотреть сообщение
Deviaphan, Сыроежка, Вы все правильно говорите, но вы по всей видимости отвлекаетесь от того что мы тут не реализацию класса int на все случаи жизни обсуждаем. Автор темы попросил помочь в одной конкретной задаче.

Сыроежка, компилятор вообще много чего оптимизирует, но этот факт не прибавляет знаний начинающим программистам.
А const нужен для того ("инцидента") чтобы автор темы не прошел мимо и при тестировании увидел разницу между:
(A = B) = C
и :
A = B = C
Вы все правильно говорите про тто, чтобы автор увидел разницу, но тем не менее как раз не позволяете автору увидеть разницу! Из вашего кода автор сделает совершенно не правильный вывод, что такая конструкция

(A = B) = C

недорустима. То есть у него будет ложная информация.
Чтобы увидеть разницу, как раз и следует корректно объявлять оператор присваивания, и тогда, выполняя такой код и получая разные значения, автор и увидет разницу.
greeezz
272 / 165 / 4
Регистрация: 10.07.2011
Сообщений: 441
28.11.2011, 23:32     Конструктор копирования(быстрый вопрос) #26
Bers,

Не по теме:

ответьте себе на вопрос. для чего вы мне задаете эти вопросы и вы поймете что к теме они отношения не имеют. может уже пора перестать цеплятся к словам и разводить демогогию.
Я просто подправил ошибки в коде который разместил автор темы. Выложил класс который работает. Если он вам не нравится - исправьте ошибки и выложите свой варинат. Намек понятен?
Я не сколько не сомниваюсь в компетенции участников форума и имею право на собственное мнение. Я написал что я согласен с комментариями и понимаю о чем идет речь. И я пояснил почему написал так как написал.
Что мне еще сделать чтобы вы перестали обсуждать меня а предлагали свои решения задачи? Есть землю из цветка или может вам пивка присалать???



Цитата Сообщение от Bers Посмотреть сообщение
И кстати, вопрос на засыпку:
Зачем классу может понадобится явный оператор=, если ему не нужен явный копирующий конструктор?
Cделайте например следующее конструктором копирования.
MyClass a(10);
MyClass b(12);
MyClass c(0);
c = a + b;

Добавлено через 1 минуту
Цитата Сообщение от Сыроежка Посмотреть сообщение
Чтобы увидеть разницу, как раз и следует корректно объявлять оператор присваивания, и тогда, выполняя такой код и получая разные значения, автор и увидет разницу.
Согласен. Надеюсь что наша дискуссия покажет автору возможные стороны медали.
Bers
Заблокирован
28.11.2011, 23:35     Конструктор копирования(быстрый вопрос) #27
C++
1
2
3
4
5
MyClass a(10);
MyClass b(12);
 
MyClass c = (a + b);   //здесь требуется явный оператор+
                                 //но не требуется оператор=
greeezz
272 / 165 / 4
Регистрация: 10.07.2011
Сообщений: 441
28.11.2011, 23:41     Конструктор копирования(быстрый вопрос) #28
Цитата Сообщение от Bers Посмотреть сообщение
C++
1
2
3
4
5
MyClass a(10);
MyClass b(12);
 
MyClass c = (a + b);   //здесь требуется явный оператор+
                                 //но не требуется оператор=
я думаю что если вы используете динамическую память при инициализации полей класса то без перегрузки оператора присвоения не обойтись
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.11.2011, 23:46     Конструктор копирования(быстрый вопрос)
Еще ссылки по теме:

Конструктор копирования C++
C++ Конструктор копирования
Конструктор копирования C++

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

Или воспользуйтесь поиском по форуму:
Bers
Заблокирован
28.11.2011, 23:46     Конструктор копирования(быстрый вопрос) #29
Цитата Сообщение от greeezz Посмотреть сообщение
я думаю что если вы используете динамическую память при инициализации полей класса то без перегрузки оператора присвоения не обойтись
Поймите одну вещь. Если вам не нужен явный копирующий конструктор, значит вам не нужен и явный оператор=.

Если нужны - то нужны оба. Всегда.
В противном случае - нарушение инварианта класса. В отдельных ситуациях он будит фейлится.
Yandex
Объявления
28.11.2011, 23:46     Конструктор копирования(быстрый вопрос)
Ответ Создать тему
Опции темы

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