один вопрос о значении по умолчанию в C++

У меня есть некоторые вопросы о значениях по умолчанию в списке параметра функции

1) Действительно ли значение по умолчанию является частью подписи? Что относительно типа параметра параметров по умолчанию?

2) Где значение по умолчанию хранится? В стеке или или глобальная "куча" или в постоянном сегменте данных?

Спасибо!

8
задан skydoor 3 March 2010 в 18:52
поделиться

4 ответа

Нет, аргумент по умолчанию не является частью сигнатуры и не является частью типа функции.

Тип параметра является частью подписи. Но тип аргумента по умолчанию не влияет на тип параметра, то есть тип аргумента по умолчанию не влияет на подпись.

Аргументы по умолчанию нигде специально не «хранятся». Аргументы по умолчанию - это «синтаксический сахар», который существует (как аргументы по умолчанию) только во время компиляции программы. Если во время компиляции компилятор обнаруживает, что какой-то аргумент отсутствует, он будет использовать аргумент по умолчанию, указанный вами. Оценка аргумента по умолчанию выполняется в контексте вызывающего.Если вы укажете временный объект в качестве аргумента по умолчанию, отдельный временный объект будет создаваться каждый раз, когда вы вызываете функцию с использованием аргумента по умолчанию, и уничтожается сразу после завершения вызывающего выражения.

void foo(T t = T());
// A new temporary will be used as an argument every time you call it as `foo()`

foo();
// Equivalent to `foo(T())`. A temporary is created here, passed as an argument and 
// destroyed afterwards, just like an explicit temporary would be

Если вы укажете существующий объект со статической продолжительностью хранения в качестве аргумента по умолчанию, то он будет храниться там, где вы его определите.

T global;

void foo(T& t = global);
// In this case you are using a global object as a default argument
// It is you who "store" it wherever you want to store it

foo();
// Equivalent to `foo(global)`

Если вы объявляете аргументы по умолчанию, но никогда не используете их на самом деле, т.е. если вы указываете аргументы каждый раз явно, то в скомпилированной программе не будет вообще никаких следов этих аргументов (вот почему я назвал их во время компиляции «синтаксическим сахаром») ).

P.S. Чтобы включить то, что Йоханнес говорит в комментарии ниже: даже несмотря на то, что аргумент по умолчанию (если он используется) оценивается в контексте вызывающего абонента в момент вызова, это не выполняется «текстовой подстановкой», как это может быть видно из моих примеров выше. В частности, поиск имен для имен, используемых в аргументах по умолчанию, выполняется в точке, когда аргумент по умолчанию указан в объявлении функции, а не в точке оценки в вызывающей стороне.

17
ответ дан 5 December 2019 в 08:51
поделиться
// declaration
void func( int param = 3 );

//...

int main( void )
{
    // doing 
    func();

    // will probably give the same assembly as doing 
    func(3);
}

Таким образом, перед вызовом func она просто подставит 3, как и любой другой параметр.

обратите внимание, это всего лишь предположение.

0
ответ дан 5 December 2019 в 08:51
поделиться

1) Тип / сигнатура функции, которая имеет параметры по умолчанию совпадают с типом / сигнатурой функции, если параметр был там без какого-либо значения по умолчанию:

// foo1 and foo2 are both functions taking an int, and returning an int.
int foo1(int);
int foo2(int a = 0);

typedef int(*int_fn_ptr)(int);
int_fn_ptr f1 = foo1; // OK, assigning a function pointer
int_fn_ptr f2 = foo2; // OK

typedef int(*void_fn_ptr)(void);
void_fn_ptr f3 = foo2; // doesn't compile

2) Значения по умолчанию создаются вызывающей стороной при вызове функции. Фактически, компилятор просто заменяет:

foo2();

на:

foo2(0);

, как только видит это. Вот почему значения по умолчанию должны быть указаны в том месте, где функция объявлена ​​, где вызывающие пользователи могут их видеть.

В некоторых других языках значение по умолчанию «принадлежит» самой функции. Возможно, имеет смысл спросить, где это значение по умолчанию «хранится», но в C ++ это не так.

1
ответ дан 5 December 2019 в 08:51
поделиться

1) Является ли значение по умолчанию частью подписи?

Нет.

А как же тип параметров по умолчанию?

Тип всегда присутствует в подписи (если вы не extern "..."), независимо от того, имеет он значения по умолчанию или нет.

2) Где хранится значение по умолчанию?

Нигде. Они заполняются компилятором автоматически.

1
ответ дан 5 December 2019 в 08:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: