С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,686
1

Почему два раза создаётся объект с ОДНИМ И ТЕМ ЖЕ ИМЕНЕМ?

15.05.2011, 23:20. Показов 995. Ответов 4
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <windows.h>
#include <iostream>
using namespace std;
 
class arr{
  public:
    arr(){  cout << "Вызов конструктора по умолчанию\n";};
    arr(int number){  cout << "Вызов конструктора по умолчанию другого\n";};
    arr& operator=(const arr& obj){cout << "Вызов констуктора присваивания\n";return *this;};
//    arr& operator=(int k){cout << "Вызов перегруженной операции присваивания\n";return *this;};
};
int main()
{
 SetConsoleCP(1251);
 SetConsoleOutputCP(1251);
 
  arr snd_;
 
  snd_= 3;
  getchar();
  return 0;
}
Вывод по запуску программы:
Bash
1
2
3
Вызов конструктора по умолчанию
Вызов конструктора по умолчанию другого
Вызов констуктора присваивания
...Собсно, уже смешно
Два раза вызывается конструктор по умолчания. Первый раз я согласен корректно. А второй?
++++++++++++++++++++++++
C++
1
snd_= 3;
Это никакое не создание объекта, а вызов конструктра инициализации. Да ещё он и выполнен неправильно, ибо
// arr& operator=(int k){cout << "Вызов перегруженной операции присваивания\n";return *this;};
закомментирован, как вы видите.

...Тем не менее, никто ничё, как так и надо. Итак, имеем: объект snd создался 2(!) раза да плюс к тому вызвался
C++
1
arr& operator=(const arr& obj)
, который здесь ни к селу, ни к городу потому, что правый операнд в выражении snd_= 3 имеет тип int, а вовсе не arr& obj;

Короче я совсем запутался, помогите, кто может, спасибо.

Добавлено через 8 минут
Так-то прикольно, можно сколько угодно раз создавать объект
C++
1
2
3
4
5
  arr snd_;
  snd_= 3;
  snd_= 4;
  snd_= 5;
  snd_= 6;
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.05.2011, 23:20
Ответы с готовыми решениями:

объекты с одним и тем же именем
В учебнике Шилдта в листинге про сборщик мусора нашел такой интересный код: public class...

Что будет, если new вызвать 2 раза с одним и тем же указателем?
Собственно вопрос что будет? напрмер int *i=new(1); i=new(3); i будет сылаться на ячеку со...

4 раза в памяти создается объект класса
Доброго времени суток! Есть следующий код: #include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include...

Почему файл из Интернета сохраняется не под тем именем?
Приветствую. Вот код: procedure TfmCRL_Downloader.bStartDownloadClick(Sender: TObject);...

4
Каратель
Эксперт С++
6610 / 4029 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
15.05.2011, 23:31 2
kravam, чтобы невозникало таких конфузов, конструкторы с одним параметром надо делать explicit

Добавлено через 1 минуту
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <windows.h>
#include <iostream>
using namespace std;
 
class arr{
  public:
    arr(){  cout << "Вызов конструктора по умолчанию\n";};
    explicit arr(int number){  cout << "Вызов конструктора по умолчанию другого\n";};
    arr& operator=(const arr& obj){cout << "Вызов констуктора присваивания\n";return *this;};
//    arr& operator=(int k){cout << "Вызов перегруженной операции присваивания\n";return *this;};
};
int main()
{
 SetConsoleCP(1251);
 SetConsoleOutputCP(1251);
 
  arr snd_;
 
  snd_= 3; //error
  getchar();
  return 0;
}
1
4865 / 2664 / 913
Регистрация: 29.11.2010
Сообщений: 5,745
15.05.2011, 23:39 3
Конструктор объекта вызывается только один раз. Объясняю поведение данного кода.
C++
1
2
3
4
5
6
7
8
9
10
arr snd_; // тут единственный раз будет вызван конструктор по-умолчанию
  // конструкцию
  snd_= 3;
  // компилятор считает как
  // snd_ = arr(3);
  // для выполнения неявно создастся временный объект класса arr с вызовом 
  // второго конструктора, затем объекту snd_ будет присвоено значение этого
  // временного класса с помощью оператора "=".
  // чтобы избежать подобного неявного поведения, конструктор с единственным
  // параметром надо задать c помощью explicit
1
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,686
16.05.2011, 00:11  [ТС] 4
Это понятно, а вот интересно:
C++
1
arr snd_= 89;
наверное, трактуется как:
C++
1
arr snd_(arr(89));
? Вроде сходится...
0
4865 / 2664 / 913
Регистрация: 29.11.2010
Сообщений: 5,745
16.05.2011, 01:45 5
AFAIK,
C++
1
Class A = value;
это то же инициализирование, то есть, вызов подходящего конструктора с параметром
C++
1
Class A(value);
Тест на GCC подтверждает.
0
16.05.2011, 01:45
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.05.2011, 01:45
Помогаю со студенческими работами здесь

В главной таблице два поля связаны с одним и тем же справочником, возможно такое?
Ситуация такая, есть главная таблица, по учету заправки лазерных картриджей, в ней есть поля:...

Два файла с одним именем и расширением в каталоге
я раньше думал что файл с одним именем и расширением невозможно сохранить в одном каталоге..... а...

Почему создаётся пустой объект
Всем привет. Я новичок в Unity, но неплохо знаю C#. Я пишу вот такой скрипт. using...

Почему не создается второй объект класса?
#include &lt;string&gt; // Заголовочный файл students.h class students { public:...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru