Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.67/15: Рейтинг темы: голосов - 15, средняя оценка - 4.67
galax0707

Присваивание конструктором копирования

22.07.2010, 15:46. Показов 3414. Ответов 20
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем форумчанам привет. Я совсем недавно изучаю с++. Помогите плиз понять.
К примеру вот такой код:

C++
1
2
3
4
5
6
7
#include <iostream.h>
int main()
{
    int k(10);
    cout<<k;
    return 0;
    }
или

C++
1
2
3
4
5
6
int main()
{
    int k=10;
    cout<<k;
    return 0;
  }
Компилятор молчит. В обоих случаях результат выполнения один и тот же.

Т.е какая разница между int k(10) и int k=10?
int k(10) - это тоже присваивание, или что?
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
22.07.2010, 15:46
Ответы с готовыми решениями:

Непонятки с конструктором копирования
class Table { Row* p; size_t size; public: Table(int i = 0) { p = new Row; size = i; }

Проблеммка с конструктором копирования
В общем суть: /*Создать класс - одномерный массив целых чисел (вектор). Функции-члены обращаются к отдельному элементу массива, вывода...

Ошибка с конструктором копирования
В коде в строках 59 и 60 компилятор выдает ошибку:#include&lt;iostream&gt; #include&lt;conio.h&gt; using namespace std; class...

20
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
22.07.2010, 15:51
galax0707, Полагаю конструктор с параметрами для типа int...
1
Эксперт С++
 Аватар для CyBOSSeR
2348 / 1721 / 149
Регистрация: 06.03.2009
Сообщений: 3,675
22.07.2010, 16:05
Лучший ответ Сообщение было отмечено как решение

Решение

Цитата Сообщение от galax0707 Посмотреть сообщение
int k(10)
Цитата Сообщение от galax0707 Посмотреть сообщение
int k=10
В данном случае эти записи приведут к одинаковому результату - будет вызван конструктор копирования.
3
 Аватар для besstiaa
94 / 94 / 14
Регистрация: 04.06.2010
Сообщений: 223
22.07.2010, 16:05
И в том, и другом случае используется один и тот же конструктор копирования с одним аргументом. Разницы никакой.
2
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
22.07.2010, 21:52
Лучший ответ Сообщение было отмечено как решение

Решение

galax0707, эти две записи имеют лишь концептуально различное значение, но по сути в данном случае означают одно и то же. "k(10)" означает, что создаётся объект k и инициализируется значением 10. "k = 10" означает, что создаётся неинициализированный объект k, а затем выполняется оператор присваивания, аргументом которого является некий безымяный объект со значением 10. В случае, когда k имеет простой тип "int" эти два действия означают одно и то же. В случае, когда k имеет тип класса, в котором определены конструктор (инициализатор) и оператор присваивания, то ты можешь запрограммировать их так, что эти действия будут различными
3
Эксперт С++
2924 / 1274 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
22.07.2010, 23:32
Лучший ответ Сообщение было отмечено как решение

Решение

Цитата Сообщение от Evg Посмотреть сообщение
"k = 10" означает, что создаётся неинициализированный объект k, а затем выполняется оператор присваивания, аргументом которого является некий безымяный объект со значением 10. .... В случае, когда k имеет тип класса, в котором определены конструктор (инициализатор) и оператор присваивания, то ты можешь запрограммировать их так, что эти действия будут различными
Вот тут я не соглашусь с коллегой Evg. Обе записи в данном случае имеют один и тот же смысл - неинициализированный объект на самом деле никогда не создается, объект k сразу же инициализируется значением 10, и оператор присваивания не вызывается.
А вот если бы код был таким:
C++
1
2
int k;
k = 10;
- то да, сначала создавался бы неинициализированный объект k, а затем вызывался бы оператор присваивания (назначения).
4
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
23.07.2010, 13:46
Действительно, так и получается. Однако не знал. Получается так, что записи "int k = 10" и "int k (10)" тождественно равны (не только для int'а, но и для любого класса). А та разница, о чём я писал, на самом деле является разницей между записями "int k = 10" и "int k; k = 10". Теперь мне понятно, почему в Си++ разрешены объявления переменных "посередине" лексического блока: это в первую очередь диктуется НЕэквивалентностью двух указанных выше записей (которые в Си эквивалентны), а не удобством

Добавлено через 57 минут
CheshireCat, подтверди или опровергни то, правильно ли я понял. А то я это в статью хочу вставить
0
Эксперт С++
 Аватар для CyBOSSeR
2348 / 1721 / 149
Регистрация: 06.03.2009
Сообщений: 3,675
23.07.2010, 14:01
Цитата Сообщение от Evg Посмотреть сообщение
Получается так, что записи "int k = 10" и "int k (10)" тождественно равны (не только для int'а, но и для любого класса).
Именно так. Запись:
C++
1
Foo bar = value;
является инициализацией, т.к. объект bar еще не создан, поэтому будет вызван подходящий конструктор, а не оператор присваивания.
0
34 / 34 / 8
Регистрация: 07.06.2010
Сообщений: 118
23.07.2010, 15:24
А почему в данном случаи
C++
1
int k(10);
вызывается именно конструктор копирования, как воспринимается 10, то есть если 10 считать неким числовым литералом то должен вызваться конструктор для типа int с одним аргументом, а если 10 считать бьектом, типа int то тогда должен быть вызван конструктор копирования ?
0
Эксперт С++
 Аватар для CyBOSSeR
2348 / 1721 / 149
Регистрация: 06.03.2009
Сообщений: 3,675
23.07.2010, 17:30
Цитата Сообщение от Freeman Посмотреть сообщение
вызывается именно конструктор копирования, как воспринимается 10, то есть если 10 считать неким числовым литералом то должен вызваться конструктор для типа int с одним аргументом, а если 10 считать бьектом, типа int то тогда должен быть вызван конструктор копирования ?
Как я понимаю, встроенные типы классами в привычном понимании не являются. Поэтому что в данном случае вызывается неизвестно, да и, вообщем-то, не важно. Смысл в том что обе записи являются инициализацией, и посему их действие будет идентичным.
0
62 / 62 / 13
Регистрация: 27.01.2009
Сообщений: 279
29.11.2010, 23:57
Цитата Сообщение от CheshireCat Посмотреть сообщение
Вот тут я не соглашусь с коллегой Evg. Обе записи в данном случае имеют один и тот же смысл - неинициализированный объект на самом деле никогда не создается, объект k сразу же инициализируется значением 10, и оператор присваивания не вызывается.
А вот если бы код был таким:
хотелось бы задать вопрос, например у нас есть код
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class MyClass{
        int val;
public:
        MyClass(int i)
        {
                val = i;
                cout << "Vnutri konstruktora " << val << endl;
        }
 
        ~MyClass()
        {
            cout << "Razrushenie Obiekta " << val << endl;
        }
 
        int getval(){return val;}
 
};
конструктор объявлен с 1 параметром то есть в ф-ции меин

C++
1
2
3
4
5
int main()
{
    MyClass a(10);
    // еквивалентно MyClass a = 10;
}
вопрос по поводу ключевого слова
C++
1
explicit
я его встречал в прототипах стл-векторах, зачем оно надо(зачем запрещать не явное преобразование аргумента) или это только надо если перегружаешь оператор "="?
0
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
30.11.2010, 00:00
ММ???
Ключевое слово explicit запрещает автоматическое создание конвертирующего конструктора. Вот так работает конвертирующий консруктор, создаваемый компилятором автоматически:
class FruitBasket { public: FruitBasket(int);}// ...FruitBasket fb = 5; // Прокатит! Автоматическое преобразование int в объект FruitBasket
А вот так можно запретить создание автоматичекого конвертирующего конструктора:

class FruitBasket { public: explicit FruitBasket(int);}// ...FruitBasket fb = 5; // Не прокатит!FruitBasket fb = FruitBasket(5); // Прокатит! Сработает копирующий конструктор, который тоже создается автоматически
1
62 / 62 / 13
Регистрация: 27.01.2009
Сообщений: 279
30.11.2010, 00:07
Цитата Сообщение от ForEveR Посмотреть сообщение
ММ???
а почему вот так вот плохо
C++
1
FruitBasket fb = 5;
с автоматическим преобразованием int в объект FruitBasket, почему в некоторых случаях это не допустимо?
а в этом случае
C++
1
FruitBasket fb = FruitBasket(5);
сработает разве не просто побитовое копирование если конструктор копирования у нас в классе не определен?
0
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
30.11.2010, 00:14
norge_goth, Иногда бывает такое, что так нужно. explicit довольно редко используется. Но все же из-за explicit коструктора в векторе например - мы не можем провести его инициализацию типа
C++
1
std::vector<int>=5;
0
62 / 62 / 13
Регистрация: 27.01.2009
Сообщений: 279
30.11.2010, 00:17
Цитата Сообщение от ForEveR Посмотреть сообщение
std::vector<int>=5;
та эт понятно... просто логика не понятна почему так плохо, а через скобки хорошо
0
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
30.11.2010, 00:19
norge_goth, Ну хотя бы потому, что абсолютно не факт что делает конструктор.

В векторе к примеру.

C++
1
std::vector<int> Vec=5;
Должно бы значить что в векторе 1 элемент пятерка. Но это не работает.
А вот так:
C++
1
std::vector<int>=std::vector<int>(5);
Значит что в векторе 5 нулевых элементов. Не правда-ли нехилая разница?
1
62 / 62 / 13
Регистрация: 27.01.2009
Сообщений: 279
30.11.2010, 00:25
Цитата Сообщение от ForEveR Посмотреть сообщение
Значит что в векторе 5 нулевых элементов. Не правда-ли нехилая разница?
да в первом варианте как-то не оч с вектором очевидно стает
наверно это было придумана для того чтобы не делать такие не очевидные глупости и не путаться потом в коде особенно в чужом... если мое рассуждение верно - то просто удивительно что для этого в С++ существует целое ключевое слово! если чесно конструкция наподобие
C++
1
std::vector<int> Vec=5;
мне б и в голову не пришла
0
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
30.11.2010, 00:27
norge_goth, Мне бы тоже) Но все же. Не только для этого. Для запрета конструктора преобразования. И используется оно не часто.
0
62 / 62 / 13
Регистрация: 27.01.2009
Сообщений: 279
30.11.2010, 00:31
Цитата Сообщение от ForEveR Посмотреть сообщение
Для запрета конструктора преобразования.
а вот насчет этого конструктора преобразования, чем он может быть опасен? есть реальные примеры?
0
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
30.11.2010, 00:35
norge_goth, Я уже показал. Явные создавать можно, неявные - нет.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
30.11.2010, 00:35
Помогаю со студенческими работами здесь

Шаблон с конструктором копирования
Найдите периметр и площадь выпуклого многоугольника. Распределение памяти для хранения массивов должно осуществляться динамически(в...

Скопировать массив конструктором копирования
Можете привести пример как скопировать массив конструктором копирования.

Не получается разобраться с конструктором копирования
Вот начала разбираться с конструктором копирования. но я чёт запуталась с ним. Можете помочь? #ifndef PEOPLE_H #define PEOPLE_H ...

Нюансы работы с конструктором копирования: найти и исправить ошибки в коде
Доброго дня! Разбирал тему &quot;Конструктор копирования&quot;. Сделал самостоятельно наглядную программу, но она по результатам отличается от той,...

Конструктор копирования кидает исключение, если копируют объект, созданные дефолтным конструктором
Привет! Вопрос из области философии - наткнулся на такое поведение при работе с IBPP (С++ клиент для работы с Firebird. Firebird - это...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru