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

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 15, средняя оценка - 4.73
galax0707
Сообщений: n/a
22.07.2010, 15:46     Присваивание конструктором копирования #1
Всем форумчанам привет. Я совсем недавно изучаю с++. Помогите плиз понять.
К примеру вот такой код:

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) - это тоже присваивание, или что?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.07.2010, 15:46     Присваивание конструктором копирования
Посмотрите здесь:

Проблема с конструктором. C++
Ошибка с конструктором копирования C++
C++ Работа с конструктором
C++ Проблеммка с конструктором копирования
C++ шаблон с конструктором копирования
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
22.07.2010, 15:51     Присваивание конструктором копирования #2
galax0707, Полагаю конструктор с параметрами для типа int...
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2293 / 1663 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
22.07.2010, 16:05     Присваивание конструктором копирования #3
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от galax0707 Посмотреть сообщение
int k(10)
Цитата Сообщение от galax0707 Посмотреть сообщение
int k=10
В данном случае эти записи приведут к одинаковому результату - будет вызван конструктор копирования.
besstiaa
 Аватар для besstiaa
93 / 93 / 7
Регистрация: 04.06.2010
Сообщений: 223
22.07.2010, 16:05     Присваивание конструктором копирования #4
И в том, и другом случае используется один и тот же конструктор копирования с одним аргументом. Разницы никакой.
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16821 / 5242 / 318
Регистрация: 30.03.2009
Сообщений: 14,118
Записей в блоге: 26
22.07.2010, 21:52     Присваивание конструктором копирования #5
Сообщение было отмечено автором темы, экспертом или модератором как ответ
galax0707, эти две записи имеют лишь концептуально различное значение, но по сути в данном случае означают одно и то же. "k(10)" означает, что создаётся объект k и инициализируется значением 10. "k = 10" означает, что создаётся неинициализированный объект k, а затем выполняется оператор присваивания, аргументом которого является некий безымяный объект со значением 10. В случае, когда k имеет простой тип "int" эти два действия означают одно и то же. В случае, когда k имеет тип класса, в котором определены конструктор (инициализатор) и оператор присваивания, то ты можешь запрограммировать их так, что эти действия будут различными
CheshireCat
Эксперт С++
2907 / 1235 / 78
Регистрация: 27.05.2008
Сообщений: 3,307
22.07.2010, 23:32     Присваивание конструктором копирования #6
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от Evg Посмотреть сообщение
"k = 10" означает, что создаётся неинициализированный объект k, а затем выполняется оператор присваивания, аргументом которого является некий безымяный объект со значением 10. .... В случае, когда k имеет тип класса, в котором определены конструктор (инициализатор) и оператор присваивания, то ты можешь запрограммировать их так, что эти действия будут различными
Вот тут я не соглашусь с коллегой Evg. Обе записи в данном случае имеют один и тот же смысл - неинициализированный объект на самом деле никогда не создается, объект k сразу же инициализируется значением 10, и оператор присваивания не вызывается.
А вот если бы код был таким:
C++
1
2
int k;
k = 10;
- то да, сначала создавался бы неинициализированный объект k, а затем вызывался бы оператор присваивания (назначения).
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16821 / 5242 / 318
Регистрация: 30.03.2009
Сообщений: 14,118
Записей в блоге: 26
23.07.2010, 13:46     Присваивание конструктором копирования #7
Действительно, так и получается. Однако не знал. Получается так, что записи "int k = 10" и "int k (10)" тождественно равны (не только для int'а, но и для любого класса). А та разница, о чём я писал, на самом деле является разницей между записями "int k = 10" и "int k; k = 10". Теперь мне понятно, почему в Си++ разрешены объявления переменных "посередине" лексического блока: это в первую очередь диктуется НЕэквивалентностью двух указанных выше записей (которые в Си эквивалентны), а не удобством

Добавлено через 57 минут
CheshireCat, подтверди или опровергни то, правильно ли я понял. А то я это в статью хочу вставить
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2293 / 1663 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
23.07.2010, 14:01     Присваивание конструктором копирования #8
Цитата Сообщение от Evg Посмотреть сообщение
Получается так, что записи "int k = 10" и "int k (10)" тождественно равны (не только для int'а, но и для любого класса).
Именно так. Запись:
C++
1
Foo bar = value;
является инициализацией, т.к. объект bar еще не создан, поэтому будет вызван подходящий конструктор, а не оператор присваивания.
[Freeman]
34 / 34 / 6
Регистрация: 07.06.2010
Сообщений: 118
23.07.2010, 15:24     Присваивание конструктором копирования #9
А почему в данном случаи
C++
1
int k(10);
вызывается именно конструктор копирования, как воспринимается 10, то есть если 10 считать неким числовым литералом то должен вызваться конструктор для типа int с одним аргументом, а если 10 считать бьектом, типа int то тогда должен быть вызван конструктор копирования ?
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2293 / 1663 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
23.07.2010, 17:30     Присваивание конструктором копирования #10
Цитата Сообщение от Freeman Посмотреть сообщение
вызывается именно конструктор копирования, как воспринимается 10, то есть если 10 считать неким числовым литералом то должен вызваться конструктор для типа int с одним аргументом, а если 10 считать бьектом, типа int то тогда должен быть вызван конструктор копирования ?
Как я понимаю, встроенные типы классами в привычном понимании не являются. Поэтому что в данном случае вызывается неизвестно, да и, вообщем-то, не важно. Смысл в том что обе записи являются инициализацией, и посему их действие будет идентичным.
norge_goth
62 / 62 / 7
Регистрация: 27.01.2009
Сообщений: 279
29.11.2010, 23:57     Присваивание конструктором копирования #11
Цитата Сообщение от 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
я его встречал в прототипах стл-векторах, зачем оно надо(зачем запрещать не явное преобразование аргумента) или это только надо если перегружаешь оператор "="?
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
30.11.2010, 00:00     Присваивание конструктором копирования #12
ММ???
Ключевое слово explicit запрещает автоматическое создание конвертирующего конструктора. Вот так работает конвертирующий консруктор, создаваемый компилятором автоматически:
class FruitBasket { public: FruitBasket(int);}// ...FruitBasket fb = 5; // Прокатит! Автоматическое преобразование int в объект FruitBasket
А вот так можно запретить создание автоматичекого конвертирующего конструктора:

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

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

C++
1
std::vector<int> Vec=5;
Должно бы значить что в векторе 1 элемент пятерка. Но это не работает.
А вот так:
C++
1
std::vector<int>=std::vector<int>(5);
Значит что в векторе 5 нулевых элементов. Не правда-ли нехилая разница?
norge_goth
62 / 62 / 7
Регистрация: 27.01.2009
Сообщений: 279
30.11.2010, 00:25     Присваивание конструктором копирования #17
Цитата Сообщение от ForEveR Посмотреть сообщение
Значит что в векторе 5 нулевых элементов. Не правда-ли нехилая разница?
да в первом варианте как-то не оч с вектором очевидно стает
наверно это было придумана для того чтобы не делать такие не очевидные глупости и не путаться потом в коде особенно в чужом... если мое рассуждение верно - то просто удивительно что для этого в С++ существует целое ключевое слово! если чесно конструкция наподобие
C++
1
std::vector<int> Vec=5;
мне б и в голову не пришла
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
30.11.2010, 00:27     Присваивание конструктором копирования #18
norge_goth, Мне бы тоже) Но все же. Не только для этого. Для запрета конструктора преобразования. И используется оно не часто.
norge_goth
62 / 62 / 7
Регистрация: 27.01.2009
Сообщений: 279
30.11.2010, 00:31     Присваивание конструктором копирования #19
Цитата Сообщение от ForEveR Посмотреть сообщение
Для запрета конструктора преобразования.
а вот насчет этого конструктора преобразования, чем он может быть опасен? есть реальные примеры?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.11.2010, 00:35     Присваивание конструктором копирования
Еще ссылки по теме:

Что-то с конструктором C++
C++ Трабла с конструктором
C++ Непонятки с конструктором копирования

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

Или воспользуйтесь поиском по форуму:
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
30.11.2010, 00:35     Присваивание конструктором копирования #20
norge_goth, Я уже показал. Явные создавать можно, неявные - нет.
Yandex
Объявления
30.11.2010, 00:35     Присваивание конструктором копирования
Ответ Создать тему
Опции темы

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