MyTetra Share
Делитесь знаниями!
Explicit
Время создания: 09.08.2017 10:27
Раздел: Computer - Programming - C++

Допустим, есть следующая программа:


#include <iostream>


using namespace std;


struct Date

{

unsigned int day;

unsigned int month;

unsigned int year;

};


void PrintDate(Date d)

{

cout << d.day << "." << d.month << "." << d.year;

}


int main()

{

Date current_date = {9, 8, 17};

PrintDate(current_date);

getchar();

return 0;

}


Но есть проблема - совершенно не ясно, что инициализируется и в каком порядке (день, месяц, год или месяц, день, год). Чтобы избавиться от этого, поменяем структуру Date таким образом, что бы она на вход принимала не значения типа int, а значения нового типа Day, Month и Year:


#include <iostream>


using namespace std;


struct Day

{

unsigned int value;

};


struct Month

{

unsigned int value;

};


struct Year

{

unsigned int value;

};


struct Date

{

Date(Day new_day, Month new_month, Year new_year)

{

day = new_day.value;

month = new_month.value;

year = new_year.value;

}


unsigned int day;

unsigned int month;

unsigned int year;

};


void PrintDate(const Date& d)

{

cout << d.day << "." << d.month << "." << d.year;

}


int main()

{

Date current_date = {{9}, {8}, {17}};

PrintDate(current_date);

getchar();

return 0;

}


Но при этом мы все равно не обязаны указывать типы в инициализации нового объекта типа Date. Достаточно взять аргументы в фигурные скобки и компилятор самостоятельно сконвертирует их в нужный тип. Можно запретить это, воспользовавших конструкторами в каждом типе (Day, Month, Year) с параметром explicit:


#include <iostream>


using namespace std;


struct Day

{

unsigned int value;

explicit Day(unsigned new_value)

{

value = new_value;

}

};


struct Month

{

unsigned int value;

explicit Month(unsigned new_value)

{

value = new_value;

}

};


struct Year

{

unsigned int value;

explicit Year(unsigned new_value)

{

value = new_value;

}

};


struct Date

{

Date(Day new_day, Month new_month, Year new_year)

{

day = new_day.value;

month = new_month.value;

year = new_year.value;

}


unsigned int day;

unsigned int month;

unsigned int year;

};


void PrintDate(const Date& d)

{

cout << d.day << "." << d.month << "." << d.year;

}


int main()

{

Date current_date = {Day{9}, Month{8}, Year{17}};

PrintDate(current_date);

getchar();

return 0;

}


Теперь инициализация типа

Date current_date = {{9}, {8}, {17}};

- не сработает, необходима явная

Date current_date = {Day{9}, Month{8}, Year{17}};

или

Date current_date = {Day(9), Month(8), Year(17)};











 
MyTetra Share v.0.53
Яндекс индекс цитирования