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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 15, средняя оценка - 4.73
galax0707
Сообщений: n/a
#1

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

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

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

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

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

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

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

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

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
ForEveR
В астрале
Эксперт С++
7972 / 4734 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
22.07.2010, 15:51 #2
galax0707, Полагаю конструктор с параметрами для типа int...
1
CyBOSSeR
Эксперт C++
2302 / 1672 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
22.07.2010, 16:05 #3
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от galax0707 Посмотреть сообщение
int k(10)
Цитата Сообщение от galax0707 Посмотреть сообщение
int k=10
В данном случае эти записи приведут к одинаковому результату - будет вызван конструктор копирования.
3
besstiaa
94 / 94 / 7
Регистрация: 04.06.2010
Сообщений: 223
22.07.2010, 16:05 #4
И в том, и другом случае используется один и тот же конструктор копирования с одним аргументом. Разницы никакой.
2
Evg
Эксперт CАвтор FAQ
17801 / 6007 / 387
Регистрация: 30.03.2009
Сообщений: 16,505
Записей в блоге: 26
22.07.2010, 21:52 #5
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
galax0707, эти две записи имеют лишь концептуально различное значение, но по сути в данном случае означают одно и то же. "k(10)" означает, что создаётся объект k и инициализируется значением 10. "k = 10" означает, что создаётся неинициализированный объект k, а затем выполняется оператор присваивания, аргументом которого является некий безымяный объект со значением 10. В случае, когда k имеет простой тип "int" эти два действия означают одно и то же. В случае, когда k имеет тип класса, в котором определены конструктор (инициализатор) и оператор присваивания, то ты можешь запрограммировать их так, что эти действия будут различными
3
CheshireCat
Эксперт С++
2892 / 1241 / 78
Регистрация: 27.05.2008
Сообщений: 3,370
22.07.2010, 23:32 #6
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от Evg Посмотреть сообщение
"k = 10" означает, что создаётся неинициализированный объект k, а затем выполняется оператор присваивания, аргументом которого является некий безымяный объект со значением 10. .... В случае, когда k имеет тип класса, в котором определены конструктор (инициализатор) и оператор присваивания, то ты можешь запрограммировать их так, что эти действия будут различными
Вот тут я не соглашусь с коллегой Evg. Обе записи в данном случае имеют один и тот же смысл - неинициализированный объект на самом деле никогда не создается, объект k сразу же инициализируется значением 10, и оператор присваивания не вызывается.
А вот если бы код был таким:
C++
1
2
int k;
k = 10;
- то да, сначала создавался бы неинициализированный объект k, а затем вызывался бы оператор присваивания (назначения).
4
Evg
Эксперт CАвтор FAQ
17801 / 6007 / 387
Регистрация: 30.03.2009
Сообщений: 16,505
Записей в блоге: 26
23.07.2010, 13:46 #7
Действительно, так и получается. Однако не знал. Получается так, что записи "int k = 10" и "int k (10)" тождественно равны (не только для int'а, но и для любого класса). А та разница, о чём я писал, на самом деле является разницей между записями "int k = 10" и "int k; k = 10". Теперь мне понятно, почему в Си++ разрешены объявления переменных "посередине" лексического блока: это в первую очередь диктуется НЕэквивалентностью двух указанных выше записей (которые в Си эквивалентны), а не удобством

Добавлено через 57 минут
CheshireCat, подтверди или опровергни то, правильно ли я понял. А то я это в статью хочу вставить
0
CyBOSSeR
Эксперт C++
2302 / 1672 / 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 еще не создан, поэтому будет вызван подходящий конструктор, а не оператор присваивания.
0
[Freeman]
34 / 34 / 6
Регистрация: 07.06.2010
Сообщений: 118
23.07.2010, 15:24 #9
А почему в данном случаи
C++
1
int k(10);
вызывается именно конструктор копирования, как воспринимается 10, то есть если 10 считать неким числовым литералом то должен вызваться конструктор для типа int с одним аргументом, а если 10 считать бьектом, типа int то тогда должен быть вызван конструктор копирования ?
0
CyBOSSeR
Эксперт C++
2302 / 1672 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
23.07.2010, 17:30 #10
Цитата Сообщение от Freeman Посмотреть сообщение
вызывается именно конструктор копирования, как воспринимается 10, то есть если 10 считать неким числовым литералом то должен вызваться конструктор для типа int с одним аргументом, а если 10 считать бьектом, типа int то тогда должен быть вызван конструктор копирования ?
Как я понимаю, встроенные типы классами в привычном понимании не являются. Поэтому что в данном случае вызывается неизвестно, да и, вообщем-то, не важно. Смысл в том что обе записи являются инициализацией, и посему их действие будет идентичным.
0
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
я его встречал в прототипах стл-векторах, зачем оно надо(зачем запрещать не явное преобразование аргумента) или это только надо если перегружаешь оператор "="?
0
ForEveR
В астрале
Эксперт С++
7972 / 4734 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 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); // Прокатит! Сработает копирующий конструктор, который тоже создается автоматически
1
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);
сработает разве не просто побитовое копирование если конструктор копирования у нас в классе не определен?
0
ForEveR
В астрале
Эксперт С++
7972 / 4734 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
30.11.2010, 00:14 #14
norge_goth, Иногда бывает такое, что так нужно. explicit довольно редко используется. Но все же из-за explicit коструктора в векторе например - мы не можем провести его инициализацию типа
C++
1
std::vector<int>=5;
0
norge_goth
62 / 62 / 7
Регистрация: 27.01.2009
Сообщений: 279
30.11.2010, 00:17 #15
Цитата Сообщение от ForEveR Посмотреть сообщение
std::vector<int>=5;
та эт понятно... просто логика не понятна почему так плохо, а через скобки хорошо
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.11.2010, 00:17
Привет! Вот еще темы с ответами:

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

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

Работа с конструктором - C++
Всем доброго времени суток. Получил задание по программированию в универе. Писать задание за меня не прошу, нужно лишь уяснить парочку...

Работа с конструктором - C++
Доброго времени суток. Обращаюсь к вам с двумя проблемами. Во-первых, Code Blocks выдаёт у меня ошибку multiple definition. Связано ли...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
30.11.2010, 00:17
Ответ Создать тему
Опции темы

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