Это не вызывает ctor по умолчанию, как написали другие. Концептуально это то же самое, но на практике вы не найдете вызова функции в коде сборки.
Вместо этого члены остаются неинициализированными; вы инициализируете их с помощью фигурной скобки.
Интересно, что это:
PhoneNumber homePhone = {858, 555, 1234};
Результаты в этой сборке (GCC 4.0.1, -O0):
movl $858, -20(%ebp)
movl $555, -16(%ebp)
movl $1234, -12(%ebp)
Не так много сюрпризов. Сборка является встроенной функцией, содержащей приведенный выше оператор C ++. Значения (начиная с $) перемещаются (movl) в смещения в стек (регистр ebp). Они отрицательны, потому что ячейки памяти для членов структуры предшествуют коду инициализации.
Если вы не полностью инициализируете структуру, то есть пропустите некоторые элементы, например, так:
PhoneNumber homePhone = {858, 555};
... тогда я получаю следующий код сборки:
movl $0, -20(%ebp)
movl $0, -16(%ebp)
movl $0, -12(%ebp)
movl $858, -20(%ebp)
movl $555, -16(%ebp)
Похоже, что компилятор затем делает что-то очень похожее на вызов конструктора по умолчанию, за которым следует присваивание. Но опять же, это встроенная функция вызова, а не вызов функции.
Если, с другой стороны, вы определяете конструктор по умолчанию, который инициализирует элементы заданными значениями, например, так:
struct PhoneNumber {
PhoneNumber()
: areaCode(858)
, prefix(555)
, suffix(1234)
{
}
int areaCode;
int prefix;
int suffix;
};
PhoneNumber homePhone;
Затем вы получаете ассемблерный код, который фактически вызывает функцию и инициализирует элементы данных через указатель на структуру:
movl 8(%ebp), %eax
movl $858, (%eax)
movl 8(%ebp), %eax
movl $555, 4(%eax)
movl 8(%ebp), %eax
movl $1234, 8(%eax)
Каждая строка, которая идет movl 8(%ebp), %eax
, устанавливает значение указателя (eax-регистр) на начало данных структуры. В других строках eax используется напрямую со смещением 4 и смещением 8, аналогично прямой адресации стека в предыдущих двух примерах.
Конечно, все это относится к реализации компилятора, но я был бы удивлен, если бы другие компиляторы сделали что-то необычное.