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

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

Войти
Регистрация
Восстановить пароль
 
 
Scatten
1 / 1 / 0
Регистрация: 28.04.2013
Сообщений: 55
#1

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

28.06.2013, 10:52. Просмотров 909. Ответов 20
Метки нет (Все метки)

Подскажите пожалуйста в моём случае конструктор копирования правильно реализован?

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
class Massiv
{
private:
 
      float *a;
      int n;
 
public:
 
      Massiv(int x)
      { n = x;
        a = new float[n];
      }
 
      virtual ~Massiv()
      {
          delete a;
      }
 
      Massiv(const Massiv& Copy)
      {
          this->n = Copy.n;
          this->a = new float[Copy.n];
      }
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.06.2013, 10:52
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Конструктор копирования (C++):

Не могу сделать чтобы класс содержал основной конструктор и конструктор копирования - C++
Разработать класс ThreeAngle для работы с плоскими треугольниками. В качестве членов-данных задаются длины трех сторон треугольника. Класс...

Не могу правильно сделать конструктор и конструктор копирования и принадлежность точки с заданными координатами треугольнику - C++
#include "stdafx.h" #include <iostream> #include <conio.h> #include <windows.h> #include <math.h> #include <algorithm> using...

Конструктор инициализации, конструктор копирования, деструктор - C++
Я сделал почти задание по перегрузке операторов. Осталось одно, тоесть три: конструктор инициализации, конструктор копирования, деструктор....

Создать класс "Вектор" и реализовать конструктор по умолчанию, конструктор копирования и деструктор - C++
Всем доброго времени суток! нужна ваша помощь! нужно создать класс вектор и реализовать конструктор по умолчанию, копирования и...

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

Конструктор копирования - C++
class alpha { public: alpha(alpha& a) { //код } }; Подскажите, почему компилятор ругается если я пытаюсь передать...

20
Khelleos
38 / 38 / 7
Регистрация: 13.05.2010
Сообщений: 283
Записей в блоге: 1
28.06.2013, 11:37 #2
Нужно ещё скопировать данные из одного массива (Copy.a) в другой (a).
0
Tulosba
:)
Эксперт С++
4705 / 3240 / 297
Регистрация: 19.02.2013
Сообщений: 9,046
28.06.2013, 11:43 #3
@Scatten, при удалении массива надо вызывать delete[]. А еще, ознакомьтесь с "правилом трех".
0
Гром
211 / 130 / 11
Регистрация: 20.03.2009
Сообщений: 1,108
Записей в блоге: 16
Завершенные тесты: 1
28.06.2013, 13:33 #4
Еще несколько небольших замечаний:
1. В конструкторе с int-ом я бы еще произвел инициализацию объектов нулями.
2. Обычно для чисел с плавающей точкой используют double, а не float.
3. В конструкторах лучше использовать список инициализации (хотя в данном случае это некритично):
C++
1
2
3
4
5
6
Massiv::Massiv(int x):
 n(x), a(new double[n])
 {
 for (int i = 0; i < n; ++i)
  a[i] = 0;
 }
4. В конструкторе копирования использование this излишне. Можно обойтись просто
C++
1
2
3
4
5
6
Massiv::Massiv(const Massiv& M):
 n(M.n), a(new double[n])
 {
 for (int i = 0; i < n; ++i)
  a[i] = M.a[i];
 }
или, как у вас
C++
1
2
3
4
5
      Massiv(const Massiv& Copy)
      {
          n = Copy.n;
          a = new float[Copy.n];
      }
(плюс все вышесказанное в этой теме)
0
Tulosba
:)
Эксперт С++
4705 / 3240 / 297
Регистрация: 19.02.2013
Сообщений: 9,046
28.06.2013, 13:46 #5
Цитата Сообщение от Гром Посмотреть сообщение
В конструкторе с int-ом я бы еще произвел инициализацию объектов нулями.
Не помешает так же сделать его excplicit
Цитата Сообщение от Гром Посмотреть сообщение
В конструкторах лучше использовать список инициализации
Только вот не стоит забывать в каком порядке будет идти инициализация. А идти она будет в том порядке, в котором объявлены члены в классе. Т.е. сначала выполнится a(new double[n]), а потом n(x). Видите проблему?
0
Scatten
1 / 1 / 0
Регистрация: 28.04.2013
Сообщений: 55
28.06.2013, 14:19  [ТС] #6
Вот так?

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
Massiv(int x)
      { 
        n = x;
        a = new double[n];
        for (int i = 0; i < n; i++)
                    {
            a[i] = 1;
                    }
      }
 
      virtual ~Massiv()
      {
          delete[] a;
      }
 
      Massiv(const Massiv& Copy)
      {
          n = Copy.n;
          a = new double[Copy.n];
      }
      
      Massiv& operator=(const Massiv& App)
      {
          if (this != &App)
          {
        double *b = new double[App.n];
              copy(App.a, App.a + App.n, b);
              delete []a;
              a = b;
              n = App.n;
          }
          return *this;
      }
0
BumerangSP
4287 / 1409 / 121
Регистрация: 16.12.2010
Сообщений: 2,941
Записей в блоге: 3
28.06.2013, 14:22 #7
@Tulosba, кстати, студия и на такие вещи ругается:
C++
1
A(int x): n(x), a(new int[n]) {}
Т.е. n на момент передачи размера в new еще как бы не инициализирована
0
Tulosba
:)
Эксперт С++
4705 / 3240 / 297
Регистрация: 19.02.2013
Сообщений: 9,046
28.06.2013, 14:27 #8
Цитата Сообщение от BumerangSP Посмотреть сообщение
студия и на такие вещи ругается
И правильно делает. Нормальный компилятор должен об этом сообщать.
0
Khelleos
38 / 38 / 7
Регистрация: 13.05.2010
Сообщений: 283
Записей в блоге: 1
28.06.2013, 14:32 #9
1ый конструктор: лучше обнулять и будет достаточно так написать
C++
1
a = {0};
Для 2го лучше так
C++
1
2
3
4
5
6
7
Massiv(const Massiv& Copy)
{
   n = Copy.n;
   a = new double[Copy.n];
   for(int i = 0; i < n; i++)
      a[i] = Copy.a[i];
}
0
BumerangSP
4287 / 1409 / 121
Регистрация: 16.12.2010
Сообщений: 2,941
Записей в блоге: 3
28.06.2013, 14:43 #10
@Tulosba, т.е. она на тот момент не инициализирует n, а другие инициализируют. Что в этом правильного?
0
Scatten
1 / 1 / 0
Регистрация: 28.04.2013
Сообщений: 55
28.06.2013, 14:45  [ТС] #11
У меня не копирует и не присваивает. Массив из нулей постоянно выдаёт.
0
Tulosba
:)
Эксперт С++
4705 / 3240 / 297
Регистрация: 19.02.2013
Сообщений: 9,046
28.06.2013, 14:53 #12
@BumerangSP, правильно, что ругается. А не то, что не инициализирует. Инициализация идёт в порядке следования членов в классе.
0
BumerangSP
4287 / 1409 / 121
Регистрация: 16.12.2010
Сообщений: 2,941
Записей в блоге: 3
28.06.2013, 14:59 #13
@Tulosba, и все равно, странное несоответствие, источник проблем, имхо)
0
Tulosba
:)
Эксперт С++
4705 / 3240 / 297
Регистрация: 19.02.2013
Сообщений: 9,046
28.06.2013, 15:02 #14
@BumerangSP, не понял. В чем несоответствие?
0
BumerangSP
4287 / 1409 / 121
Регистрация: 16.12.2010
Сообщений: 2,941
Записей в блоге: 3
28.06.2013, 15:06 #15
@Tulosba, здесь все нормально компилируется https://ideone.com/YLffjm
0
28.06.2013, 15:06
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.06.2013, 15:06
Привет! Вот еще темы с ответами:

Конструктор копирования - C++
Здравствуйте) объясните пожалуйста в чём проблема при описании в классе конструктора копирования компилятор выдаёт ошибку:error C3699:...

Конструктор копирования - C++
#include &lt;iostream&gt; using namespace std; class test { public: int x; test(int num); test(const...

Конструктор копирования - C++
Добрый вечер. Начал изучать перегрузку операций и конструктор копирования. Лазил в инете и налепил такой код. Только вот не могу понять как...

Конструктор копирования - C++
Всем привет. У меня такая проблема: есть некий класс, допустим Test: class Test { protected: int value; ...


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

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

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