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

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

15.05.2011, 23:20. Показов 1125. Ответов 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
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
15.05.2011, 23:20
Ответы с готовыми решениями:

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

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

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

4
Каратель
Эксперт С++
6610 / 4029 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
15.05.2011, 23:31
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
4903 / 2696 / 921
Регистрация: 29.11.2010
Сообщений: 5,783
15.05.2011, 23:39
Конструктор объекта вызывается только один раз. Объясняю поведение данного кода.
C++
1
2
3
4
5
6
7
8
9
10
arr snd_; // тут единственный раз будет вызван конструктор по-умолчанию
  // конструкцию
  snd_= 3;
  // компилятор считает как
  // snd_ = arr(3);
  // для выполнения неявно создастся временный объект класса arr с вызовом 
  // второго конструктора, затем объекту snd_ будет присвоено значение этого
  // временного класса с помощью оператора "=".
  // чтобы избежать подобного неявного поведения, конструктор с единственным
  // параметром надо задать c помощью explicit
1
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
16.05.2011, 00:11  [ТС]
Это понятно, а вот интересно:
C++
1
arr snd_= 89;
наверное, трактуется как:
C++
1
arr snd_(arr(89));
? Вроде сходится...
0
 Аватар для lemegeton
4903 / 2696 / 921
Регистрация: 29.11.2010
Сообщений: 5,783
16.05.2011, 01:45
AFAIK,
C++
1
Class A = value;
это то же инициализирование, то есть, вызов подходящего конструктора с параметром
C++
1
Class A(value);
Тест на GCC подтверждает.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
16.05.2011, 01:45
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru