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

Непонятный вызов конструктора класса - C++

Восстановить пароль Регистрация
 
BigLow
55 / 55 / 2
Регистрация: 07.07.2013
Сообщений: 345
13.07.2013, 19:30     Непонятный вызов конструктора класса #1
Почему в строчке d1=500; (70 стр.) вызывается конструктор CDate(500, 1, 2000)?
Получается, целое число 500 перед присваиванием каким то образом преобразуется в тип CDate. Но почему? Вот это мне не понятно как раз.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
#include <iostream>
 
class CDate
{
public:
    CDate(int day=1, int month=1, int year=2000);
    CDate(const CDate &copy);
    const CDate &operator=(const CDate &right);
 
    CDate &AddDay(int n);
    CDate &AddMonth(int n);
    CDate &AddYear(int n);
 
    int GetDay() const;
    int GetMonth() const;
    int GetYear() const;
 
private:
    int mDay;
    int mMonth;
    int mYear;
};
 
 
CDate::CDate(int day, int month, int year)
{
    std::cout << "Конструктор CDate(" << day << ", " << month << ", " << year << ")" << std::endl;
    mDay=day;
    mMonth=month;
    mYear=year;
}
 
CDate::CDate(const CDate &copy)
{
    std::cout << "Конструктор копии CDate(" << copy.mDay << ", " << copy.mMonth << ", " << copy.mYear << ")" << std::endl;
    mDay=copy.mDay;
    mMonth=copy.mMonth;
    mYear=copy.mYear;
}
 
const CDate &CDate::operator=(const CDate &right)
{
    std::cout << "Вызов operator=(" << right.mDay << ", " << right.mMonth << ", " << right.mYear << ")" << std::endl;
    mDay=right.mDay;
    mMonth=right.mMonth;
    mYear=right.mYear;
 
    return *this;
}
 
CDate &CDate::AddDay(int n)     { std::cout << "AddDay(" << n << ")" << std::endl;  mDay += n;  return *this; }
CDate &CDate::AddMonth(int n)   { std::cout << "AddMonth(" << n << ")" << std::endl;  mMonth += n;  return *this; }
CDate &CDate::AddYear(int n)    { std::cout << "AddYear(" << n << ")" << std::endl;  mYear += n;  return *this; }
 
int CDate::GetDay() const       { return mDay; }
int CDate::GetMonth() const     { return mMonth; }
int CDate::GetYear() const      { return mYear; }
 
 
 
 
 
 
int main()
{
    setlocale(LC_ALL, "Russian");
 
    CDate d1(13,7,2013);
 
    d1=500;
    
    system("pause");
    return 0;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Кудаив
328 / 405 / 24
Регистрация: 27.05.2012
Сообщений: 1,162
Завершенные тесты: 2
13.07.2013, 19:34     Непонятный вызов конструктора класса #2
Цитата Сообщение от BigLow Посмотреть сообщение
вызывается конструктор CDate(500, 1, 2000)
потому что
Цитата Сообщение от BigLow Посмотреть сообщение
CDate(int day=1, int month=1, int year=2000)
заданы члены по умолчанию, в твоем случае day инициализируется 500, month - 1 и year - 2000
0x10
2425 / 1597 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
13.07.2013, 19:35     Непонятный вызов конструктора класса #3
BigLow, если не хочется таких эффектов, конструктор стоит объявить как explicit.
BigLow
55 / 55 / 2
Регистрация: 07.07.2013
Сообщений: 345
13.07.2013, 19:53  [ТС]     Непонятный вызов конструктора класса #4
я когда писал d1=500; то думал что программа вообще не скомпилируется, потому что от знака "=" стоят разные типы. слева CDate а справа int
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
13.07.2013, 19:59     Непонятный вызов конструктора класса #5
BigLow, отсутствие explicit всему виной. Если конструтор implicit то такая операция вполне допустима.
BigLow
55 / 55 / 2
Регистрация: 07.07.2013
Сообщений: 345
13.07.2013, 20:08  [ТС]     Непонятный вызов конструктора класса #6
Цитата Сообщение от 0x10 Посмотреть сообщение
если не хочется таких эффектов, конструктор стоит объявить как explicit.
Цитата Сообщение от ForEveR Посмотреть сообщение
отсутствие explicit всему виной.
Покопался сейчас и вот что нашел. Может кому пригодится
Конструктор, определённый как explicit, будет задействован только в том случае, когда инициализация в точности соответствует тому, что задано конструктором. Никаких преобразований выполняться не будет (т.е. спецификатор explicit создаёт "неконвертирующий конструктор").
Насколько я понял, запись d1=500; на самом деле означает d1=CDate(500);
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
13.07.2013, 20:11     Непонятный вызов конструктора класса #7
BigLow, Верно.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11822 / 6801 / 769
Регистрация: 27.09.2012
Сообщений: 16,868
Записей в блоге: 2
Завершенные тесты: 1
13.07.2013, 20:12     Непонятный вызов конструктора класса #8
Только необходимо учитывать, что с explicit конструктором нет неявного преобразования

Добавлено через 33 секунды
C++
1
2
3
4
5
6
7
8
9
struct A{
    explicit A(int x){
    }
};
 
int main(){
    A a(10);//OK!
    A b = 10;//Ошибка
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.07.2013, 23:50     Непонятный вызов конструктора класса
Еще ссылки по теме:

Вызов конструктора базового класса из класса-наследника C++
C++ Повторный вызов конструктора класса
C++ Вызов конструктора класса

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

Или воспользуйтесь поиском по форуму:
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
13.07.2013, 23:50     Непонятный вызов конструктора класса #9
Цитата Сообщение от Croessmah Посмотреть сообщение
с explicit конструктором нет неявного преобразования
на то он и explicit (явный)
Yandex
Объявления
13.07.2013, 23:50     Непонятный вызов конструктора класса
Ответ Создать тему
Опции темы

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