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

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

Восстановить пароль Регистрация
 
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
15.05.2011, 23:20     Почему два раза создаётся объект с ОДНИМ И ТЕМ ЖЕ ИМЕНЕМ? #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";};
    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;
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
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;
}
lemegeton
 Аватар для lemegeton
2910 / 1339 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
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
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
16.05.2011, 00:11  [ТС]     Почему два раза создаётся объект с ОДНИМ И ТЕМ ЖЕ ИМЕНЕМ? #4
Это понятно, а вот интересно:
C++
1
arr snd_= 89;
наверное, трактуется как:
C++
1
arr snd_(arr(89));
? Вроде сходится...
lemegeton
 Аватар для lemegeton
2910 / 1339 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
16.05.2011, 01:45     Почему два раза создаётся объект с ОДНИМ И ТЕМ ЖЕ ИМЕНЕМ? #5
AFAIK,
C++
1
Class A = value;
это то же инициализирование, то есть, вызов подходящего конструктора с параметром
C++
1
Class A(value);
Тест на GCC подтверждает.
Yandex
Объявления
16.05.2011, 01:45     Почему два раза создаётся объект с ОДНИМ И ТЕМ ЖЕ ИМЕНЕМ?
Ответ Создать тему
Опции темы

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