Форум программистов, компьютерный форум 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++ шаблон с конструктором копирования
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.11.2010, 00:42     Присваивание конструктором копирования
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
norge_goth
62 / 62 / 7
Регистрация: 27.01.2009
Сообщений: 279
30.11.2010, 00:42     Присваивание конструктором копирования #21
Цитата Сообщение от ForEveR Посмотреть сообщение
Я уже показал. Явные создавать можно, неявные - нет.
все нашел, и разобрался сразу по двум пунктам, так как ссылки нельзя кидать кину основной момент
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
 
class sss
{
public:
  explicit sss( int ) {
    std::cout << "int" << std::endl;
  };
 
  sss( double ) {
    std::cout << "double" << std::endl;
  };
};
 
int main()
{
 sss ddd(7);
 sss xxx = 7;
 
 return 0;
}
Известно, что все целые числа по стандарту автоматически имеют тип int, если иного явно не указано. Т.е. число 7 в примере выше имеет тип int. Поэтому, кажется на первый взгляд, что в обоих случаях будет вызван конструктор принимающий int. Однако, это не так.

Запись вида «sss ddd( 7 );» является явным вызовом конструктора, а «sss xxx = 7;» — неявным. Если бы конструктор с int был в private секции, то была бы выдана ошибка. Но ключевое слово explicit скывает конструктор так незаметно, что даже предупреждения компилятор не выдаст. Если скомпилировать и запустить пример, то окажется, что во втором случает будет вызван конструктор, принимающий double. Это может оказаться довольно неожиданным поворотом событий, если не разбираться в формах вызовов конструкторов. Часто разработчики не придают особого значения как они конструируют объект.

Если написать explicit для обоих конструкторов, то ошибки можно будет избежать — компилятор подскажет где ошибка. Поэтому explicit следует писать для всех конструкторов с одним параметром, если специально не предполагается другое поведение. Мне кажется, что это стоило делать по умолчанию в стандарте, а для других случаев ввести что-то вроде nonexplicit.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Yandex
Объявления
30.11.2010, 00:42     Присваивание конструктором копирования
Ответ Создать тему
Опции темы

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