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

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

Войти
Регистрация
Восстановить пароль
 
taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
#1

Копии - C++

17.03.2010, 09:22. Просмотров 731. Ответов 10
Метки нет (Все метки)

C++
1
2
3
4
5
6
7
8
9
10
11
class a
{
 ...
 public:
 a (a &o);
 a &operator = (a &o);
 ...
};
....
a o1,o2;
o2=o1;// Здесь вызывается только конструктор, но не оператор. Это нормально?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.03.2010, 09:22
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Копии (C++):

конструктор копии - C++
Мне кажется что здесь также должен вызывать конструктор копия при возврате объекта obj из функции Get()! Разве нет? #include <iostream.h>...

Конструктор копии - C++
Конструктор копии вызывается при: 1)явном создании копии 2)при передачи параметров в функцию (по значению) 3)при возвращении объекта...

Конструктор копии - C++
Здравствуйте! Не могу никак правильно использовать конструктор копии, тоесть создать копию обьекта (массива):( Вот конструктор с...

конструктор копии - C++
Здравствуйте. Необходимо было написать небольшую программку, связанную с выполнением определенных операций над матрицами. Я решил сделать...

Конструктор копии в Классах - C++
Подскажите пожалуйста правильно ли я написала и вызвала конструктор копии и деструктор, а то мне выдает 2 ошибки. #include...

Конструкторы копии и перемещения - C++
Объясните, пожалуйста, следующее поведение. Итак, есть 4 кода: 1: #include <iostream> #include <string> int i; class...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
CheshireCat
Эксперт С++
2892 / 1241 / 78
Регистрация: 27.05.2008
Сообщений: 3,368
17.03.2010, 09:50 #2
Нет. Приведи код, воспроизводящий данную проблему, поглядим.
taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
17.03.2010, 11:13  [ТС] #3
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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
//=================================================================================================
class TString
{
//-------------------------------------------------------------------------------------------------
 protected:
 public:
//-------------------------------------------------------------------------------------------------
  char              *Data; 
  unsigned long int  Number;
//-------------------------------------------------------------------------------------------------
  void               Clear       (                         );
//-------------------------------------------------------------------------------------------------
 public:     
//-------------------------------------------------------------------------------------------------
                     TString     (                         );                    
                     TString     (TString           &String);                     
//-------------------------------------------------------------------------------------------------
                    ~TString     (                         );
//-------------------------------------------------------------------------------------------------
  TString            operator =  (TString           &String);                    
  TString            operator =  (char              *String);
//-------------------------------------------------------------------------------------------------                    
  friend                    
  istream           &operator >> (istream           &Stream,
                                  TString           &String);                               
//-------------------------------------------------------------------------------------------------
  friend                    
  ostream           &operator << (ostream           &Stream,
                                  TString           &String);                               
//-------------------------------------------------------------------------------------------------
  void               operator += (char               Char  );
//-------------------------------------------------------------------------------------------------
  char              &operator [] (unsigned long int  Index );
//-------------------------------------------------------------------------------------------------  
};
//=================================================================================================
void
TString::            Clear       (                         )
{
 if (Data)
 {
  free(Data);  
 }
 Data  =null;
 Number=0;
}
//-------------------------------------------------------------------------------------------------
TString::            TString     (                         )
{
 Data  =null;
 Number=0;
}
//-------------------------------------------------------------------------------------------------
TString::            TString     (TString           &String)
{
 char *p1;
 char *p2;
 cerr<<"\ncopy\n";
 if (String.Number)
 {  
  Data=(char *)malloc(String.Number+1);
  if (Data)
  {
   Number=String.Number;
   for (p1=String.Data+Number, p2=Data+Number; p2>=Data; --p1, --p2)
   {    
    (*p2)=(*p1);
   }
  }
  else
  {
   Number=0;
  }
 }
 else
 {
  Data  =null;
  Number=0;
 }
}
//-------------------------------------------------------------------------------------------------
TString::           ~TString     (                         )
{
 if (Data)
 {
  free(Data);  
 }
}
//-------------------------------------------------------------------------------------------------
TString
TString::            operator =  (TString            &String)
{
 char *p1;
 char *p2;
 cerr<<"\n=string\n";
 if (String.Number)
 {  
  Data=(char *)malloc(String.Number+1);
  if (Data)
  {
   Number=String.Number;
   for (p1=String.Data+Number, p2=Data+Number; p2>=Data; --p1, --p2)
   {
    (*p2)=(*p1);   
   }
  }
  else
  {
   Number=0;
  }
 }
 else
 {
  this->Clear();
 }
 return *this;
}
//-------------------------------------------------------------------------------------------------
TString
TString::            operator =  (char              *String)
{ 
 char *p1;
 char *p2;
 for (p1=String; p1; ++p1)
 { 
  if ((*p1)=='\0')
  {
   break;
  }
 }
 Number=p1-String+1;
 if (Number)
 {
  Data=realloc (Data, Number);
  if (Data)
  {
   --Number;   
   for (p2=Data+Number; p2>=Data; --p1, --p2)
   {
    (*p2)=(*p1);
   }   
  }  
 }
 return *this;
}
//-------------------------------------------------------------------------------------------------
istream             &operator >> (istream           &Stream,
                                  TString           &String)
{
 char c;
 String.Clear();
 Stream.putback('\0');
 Stream>>c;
 while (Stream.peek()==0);
 while (Stream.peek()!=10)
 {
  Stream>>c;
  String+=c;
 }
 return Stream;
}
//-------------------------------------------------------------------------------------------------
ostream             &operator << (ostream           &Stream,
                                  TString           &String)
{
 char *p;
 char *e;
 if (String.Number)
 {
  for (e=String.Data+String.Number, p=String.Data; p<e; ++p)
  {   
   Stream<<(*p);
  }
 }
 return Stream;
}
//-------------------------------------------------------------------------------------------------
void
TString::            operator += (char               Char  )
{
 char              *Buffer;
 unsigned long int  Number;
 if (Char!=0)
 {
  Number=this->Number+2;
  if (Number)
  {
   Buffer=realloc(Data, Number);  
   if (Buffer)
   {
    this->Number                 =Number-1;   
          Data                   =Buffer;         
          Data   [this->Number  ]='\0';
          Data   [this->Number-1]=Char;
   }
  }
 }
}
//-------------------------------------------------------------------------------------------------
//=================================================================================================
Вывод:
copy
.

Добавлено через 1 час 15 минут
Меня интересует: если с одним типом параметра есть и конструктор, и оператор присваивания то как по стандарту должен вести себя компилятор: присваивать объект, или создавать конструктором.
Genius Ignat
1236 / 774 / 44
Регистрация: 16.09.2009
Сообщений: 2,014
17.03.2010, 11:39 #4
C++
1
2
a o1,o2;
o2=o1;      // здесь вызывается операция присваивания, так как оба объекта созданы
C++
1
2
a o1;
a o2 = o1;  //вызывается конструктор копирования: второй объект создается копированием первого.
taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
18.03.2010, 08:25  [ТС] #5
При полном выводе было видно, что оба объекта уже созданы конструктором. Но всёравно вызывается конструктор, судя оп всему, параметра, а оператор игнорируется и вместо него идёт, кажется, побитное копирование. В чём может быть этот глюк? Почему вообще вызывается конструктор, если сказано передать ссылку и какого фига идёт копирование параметра?
CheshireCat
Эксперт С++
2892 / 1241 / 78
Регистрация: 27.05.2008
Сообщений: 3,368
18.03.2010, 10:20 #6
Так где же код, воспроизводящий эту ошибку ???
taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
18.03.2010, 10:21  [ТС] #7
В третьем посте.
CheshireCat
Эксперт С++
2892 / 1241 / 78
Регистрация: 27.05.2008
Сообщений: 3,368
18.03.2010, 10:33 #8
Нет. Этот код не только не воспроизводит проблему, но даже не компилируется.
taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
18.03.2010, 10:38  [ТС] #9
У меня компилится. А у тебя что пишет?
CheshireCat
Эксперт С++
2892 / 1241 / 78
Регистрация: 27.05.2008
Сообщений: 3,368
18.03.2010, 11:00 #10
GCC 4.4.0:
main.cpp In member function `void TString::Clear()':
main.cpp 45 error: 'free' was not declared in this scope
main.cpp 47 error: `null' was not declared in this scope
.... (тут прочие ошибки) .....
=== Build finished: 9 errors, 0 warnings ===
taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
18.03.2010, 11:06  [ТС] #11
Перед этим:
C++
1
2
3
4
5
6
7
8
#define null 0
#define nan 0.0/0.0
//=================================================================================================
#include <iostream.h>
#include <fstream>
#include <exception>
#include <stdexcept>
#include "MyAllocs.hpp" // здесь функция-оболочка char *realloc(char *p, unsigned long int n);
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.03.2010, 11:06
Привет! Вот еще темы с ответами:

Мелкая и глубокая копии - C++
#include &lt;cassert&gt; #include &lt;cstring&gt; #include &lt;cstdlib&gt; #include &lt;cstdio&gt; #include &lt;iostream&gt; #include &lt;iomanip&gt; using...

Не вызывается конструктор копии - C++
#define st system(&quot;pause&quot;); #include &lt;iostream&gt; #include &lt;string.h&gt; using namespace std; class temp{ public: int a; char*p;...

Вызов конструктора копии - C++
Не вызывается конструктор копии из производного класса #include &lt;iostream&gt; using namespace std; class A { int x; public: ...

Ошибка обнаружении копии - C++
Столкнулся со странной ошибкой: Указывает на один и тоже файл и не реагирует ни на какие изменение в коде. В чём проблема?


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

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

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