Объявление функции C ++ в C ++, приведение типа - PullRequest
0 голосов
/ 02 февраля 2019

Я обнаружил интересный синтаксис в объявлении функции C ++ и ее определении.например,

bool myLess(const int& x=int(),const int& y=int());

как понять "= int ()" в этом объявлении?

Я предполагаю, что его эффект заключается в преобразовании входных фактических аргументов других типов в тип int,это, безусловно, так.Я могу назвать эту функцию как

          double x1{3.5}, x2{4.5};
          bool b = myLess(x1,x2);

, но я не могу понять этот синтаксис, кто-нибудь может дать мне ответ?Где я могу найти этот синтаксис в стандарте ISO C ++?

Ответы [ 2 ]

0 голосов
/ 02 февраля 2019

Вы спрашивали:

как понять "= int ()" в этом объявлении?

bool myLess(const int& x=int(),const int& y=int());

Ваше объявление функции, конечно, возвращает bool, но он принимает два параметра, которые являются константной ссылкой целочисленного типа.= для каждого параметра дает параметрам значение по умолчанию.int() вызывает конструктор по умолчанию для базового типа.Конструктор по умолчанию для int в итоге будет иметь значение prvalue со значением 0.Это приведет к тому, что x и y будут присвоены или изначально созданы со значением 0.Тогда все, что передается в функцию в качестве аргументов, перезапишет это начальное значение.

Вы можете увидеть объявления функций, написанные так, чтобы убедиться, что сами параметры всегда инициализируются чем-то конкретным 0.Таким образом, если функция когда-либо вызывается и ссылки используются после вызова функции, при следующем вычислении, использующем ссылочные переменные, не будут использоваться мусорные данные, особенно если внутренний код функции проверяет допустимые данные и делает что-то другое, если значение0Это гарантирует, что если передан только 1 параметр, то по крайней мере значение по умолчанию будет составлять 0.

. Он не имеет никакого другого эффекта, чем:

bool myLess(const int& x=0, const int& y=0);

Когда дело доходит до используемого вамипример:

double x1{3.5}, x2{4.5};
bool b = myLess(x1,x2);

Когда вы передаете x1 и x2 в эту функцию, здесь происходит то, что тип double преобразуется в тип intи вы потеряете данные или информацию из-за усечения.Даже если x1 имеет значение 3.5 и x2 имеет значение 4.5, если ваш компилятор скомпилирует приведенный выше код, значения, которые увидит функция, равны 3 и 4 соответственно.

0 голосов
/ 02 февраля 2019

Объявление просто дает аргументы по умолчанию и имеет тот же эффект, что и

bool myLess(const int& x = 0, const int& y = 0);

Вы пишете:

Я предполагаю, что его эффект заключается в преобразовании входных фактических аргументов других типовв тип int это, безусловно, так.

То есть не эффект int()!Приведение типов из double s выполняется в любом случае, и будет работать также, если вы используете = 0.Подробнее о int() также говорится в вопросе , что делает int () в C ++? .

Вы также спросили, где найти это в Iso C ++.Вот соответствующий отрывок (из черновика N3690):

[§5.2.3 (2)] Выражение T (), где T - это спецификатор простого типа или typename-спецификатор для типа объекта, не являющегося полным массивом, или типа void (возможно, с квалификацией cv), создает значение указанного типа, значение которого равно значению, полученному при инициализации значения (8.5)объект типа T;для случая void () инициализация не производится.

И в 8.5 мы видим, что int s инициализируются значением, будучи инициализированными нулями.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...