Прямая инициализация против копирования инициализации для примитивов - PullRequest
3 голосов
/ 17 августа 2011

При инициализации примитивных типов, таких как int или указателей, можно использовать copy-initialization или прямая инициализация .

int a = 10;
int b(10);

Хотя последний способ предпочтительнее для объектов с конструкторами, я не вижу людей, использующих его для примитивов. Я понимаю, что это более «естественно» (особенно для чисел) использовать оператор «=», но есть ли кто-нибудь, пишущий что-то вроде реального кода:

for (int i(0); i < 5; ++i) {
    cout << i << endl;
}

Спасибо.

РЕДАКТИРОВАТЬ: вопрос задается о стилях кодирования и лучших практиках, а не о технической реализации.

Ответы [ 4 ]

2 голосов
/ 17 августа 2011

Некоторые люди делают это, чтобы быть последовательными.

Внутри шаблона код может быть

for (T i(0); i < 5; ++i) {
    cout << i << endl;
}

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

2 голосов
/ 17 августа 2011

Обе инициализации с использованием конструктора копирования, хотя первый выглядит как назначение. Это просто синтаксический сахар.

Вы можете легко проверить это с помощью класса, который печатает что-то при создании копии и что-то другое при назначении.

И, будучи примитивом, даже не вступает в игру.

1 голос
/ 17 августа 2011

Я предпочитаю стиль i = 0, его легче читать, и вы также можете использовать его следующим образом:

if (int i = some_function())
{
}

Также отлично работает с указателями и всеми другими типами, конвертируемыми в bool:

if (const int* p = some_function())
{
}

if (shared_ptr<const int> q = some_function())
{
}
1 голос
/ 17 августа 2011

Раньше коллега делал так:

for (int i(0); i < 5; ++i) {
    cout << i << endl;
}

, и это действительно всех бесило.Гораздо проще читать код, используя i = 0, чем i(0).Возможно, не в этом примере, но, как правило, так оно и есть.

Даже для сложных объектов я всегда предпочитаю стиль i = 0, для читателя он выглядит более естественным, и любой приличный компилятор оптимизируетсгенерированный код, поэтому производительность практически не снижается.

...