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

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

Войти
Регистрация
Восстановить пароль
 
kravam
быдлокодер
1702 / 889 / 45
Регистрация: 04.06.2008
Сообщений: 5,498
#1

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

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

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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.05.2011, 23:20
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Почему два раза создаётся объект с ОДНИМ И ТЕМ ЖЕ ИМЕНЕМ? (C++):

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

Не создаётся объект string на ровном месте! Почему? - C++
Ребята, чё-то я не пойму: #include &lt;string&gt; #include &lt;stdio.h&gt; #include &lt;iostream&gt; using namespace std; int main () { char...

Почему при инициализации строки, сначала создаётся пустой объект? - C++
Чтобы при создании присвоить строке какое-то значение, можно использовать два способа: string str1(”bla-bla-bla”); или string str2 =...

Почему деструктор вызывается два раза - C++
Всем привет. Есть код, для примера #include &lt;vector&gt; using namespace std; struct AA { int n; AA() :n(0) { cout &lt;&lt;...

Даден массив. Все четные елементы массива уменьшыть в два раза, а нечетные увеличить в два раза. - C++
С++. Даден массив. Все четные елементы массива уменьшыть в два раза, а нечетные увеличить в два раза. Сложновато :sorry:

Почему последнее введенное число записывается два раза? - C++
Почему последнее введенное число записывается два раза? #include &lt;stdio.h&gt; #include &lt;string.h&gt; #include &lt;stdlib.h&gt; #include...

4
Jupiter
Каратель
Эксперт С++
6559 / 3980 / 227
Регистрация: 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;
}
1
lemegeton
2925 / 1354 / 135
Регистрация: 29.11.2010
Сообщений: 2,725
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
kravam
быдлокодер
1702 / 889 / 45
Регистрация: 04.06.2008
Сообщений: 5,498
16.05.2011, 00:11  [ТС] #4
Это понятно, а вот интересно:
C++
1
arr snd_= 89;
наверное, трактуется как:
C++
1
arr snd_(arr(89));
? Вроде сходится...
0
lemegeton
2925 / 1354 / 135
Регистрация: 29.11.2010
Сообщений: 2,725
16.05.2011, 01:45 #5
AFAIK,
C++
1
Class A = value;
это то же инициализирование, то есть, вызов подходящего конструктора с параметром
C++
1
Class A(value);
Тест на GCC подтверждает.
0
16.05.2011, 01:45
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.05.2011, 01:45
Привет! Вот еще темы с ответами:

Файлы. Программа, которая определяет если такой момент, что два раза вошли по одному пропуску или два раза вышли по одному (выводит все время истину) - C++
Всем привет. Смысл задания примерно следующий: Есть файл Input.txt. Содержание его примерное такое: Все эти цифры могут меняться. 4...

Не создаётся объект класса - C++
---------------------------------------Address.h-------------------------------------------------- #pragma once class Address { ...

почему после нажатия на ноль мне приходится два раза жать на Enter чтобы выйти из программы ,хотя я в while ук - C++
почему после нажатия на ноль мне приходится два раза жать на Enter чтобы выйти из программы ,хотя я в while указал что цикл действует пока...

Заполняет массив одним и тем же числом - C++
Почему массив не рандомится, а заполняется одним и тем же числом? #include &lt;iostream&gt; #include &lt;ctime&gt; using namespace std; ...


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

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

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