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

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

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

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

22.07.2010, 15:46. Просмотров 1894. Ответов 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) - это тоже присваивание, или что?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.11.2010, 00:42     Присваивание конструктором копирования
Еще ссылки по теме:

C++ Непонятки с конструктором копирования
C++ Скопировать массив конструктором копирования
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     Присваивание конструктором копирования
Ответ Создать тему
Опции темы

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