Делегирование конструкторов в C++ () или {}
я прочитала этой ссылке из Страуструп со следующим кодом:
class X {
int a;
public:
X(int x) { if (0<x && x<=max) a=x; else throw bad_X(x); }
X() :X{42} { }
X(string s) :X{lexical_cast<int>(s)} { }
// ...
};
мой вопрос о строку:
X() X{42}{}
есть ли различия между круглыми скобками и фигурными скобками?
если нет никаких различий, могу ли я использовать фигурные скобки и в других вызовах функций? Или это просто делегирование конструктора?
И наконец, почему мы должны иметь оба синтаксиса? Это немного двусмысленно.
2 ответов
()
использует инициализация значением если скобки пустые, или прямой инициализации если не пуста.
{}
использует инициализации, что означает инициализация значением если скобки пусты, или агрегатной инициализации если инициализированный объект является агрегатом.
поскольку X
простой int
, нет никакой разницы между инициализацией его с помощью ()
или {}
.
значения инициализации могут быть указаны в скобках или скобках.
инициализация фигурных скобок была введена с C++11, и она должна быть "равномерной инициализацией", которая может использоваться для всех нестатических переменных.
скобки могут использоваться вместо круглых скобок или знака равенства и были введены для повышения однородности и уменьшения путаницы.
Это только синтаксическая конструкция и не приводит к преимуществам производительности или штрафы.