Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Не всегда необходимо определить конструктор для class
конструктора, особенно для относительно простых. Пользователи могут инициализировать объекты объекта или class
struct
использовать единую инициализацию, как показано в следующем примере:
// no_constructor.cpp
// Compile with: cl /EHsc no_constructor.cpp
#include <time.h>
// No constructor
struct TempData
{
int StationId;
time_t timeSet;
double current;
double maxTemp;
double minTemp;
};
// Has a constructor
struct TempData2
{
TempData2(double minimum, double maximum, double cur, int id, time_t t) :
stationId{id}, timeSet{t}, current{cur}, maxTemp{maximum}, minTemp{minimum} {}
int stationId;
time_t timeSet;
double current;
double maxTemp;
double minTemp;
};
int main()
{
time_t time_to_set;
// Member initialization (in order of declaration):
TempData td{ 45978, time(&time_to_set), 28.9, 37.0, 16.7 };
// When there's no constructor, an empty brace initializer does
// value initialization = {0,0,0,0,0}
TempData td_emptyInit{};
// Uninitialized = if used, emits warning C4700 uninitialized local variable
TempData td_noInit;
// Member declaration (in order of ctor parameters)
TempData2 td2{ 16.7, 37.0, 28.9, 45978, time(&time_to_set) };
return 0;
}
class
Если конструктор или struct
нет конструктора, вы предоставляете элементы списка в том порядке, в который объявляются члены.class
class
Если у конструктора есть конструктор, укажите элементы в порядке параметров. Если тип имеет конструктор по умолчанию, неявно или явно объявленный, можно использовать инициализацию фигурных скобок с пустыми фигурными скобками для вызова. Например, можно инициализировать следующее class
с помощью пустой и непустой инициализации фигурных скобок:
#include <string>
using namespace std;
class class_a {
public:
class_a() {}
class_a(string str) : m_string{ str } {}
class_a(string str, double dbl) : m_string{ str }, m_double{ dbl } {}
double m_double;
string m_string;
};
int main()
{
class_a c1{};
class_a c1_1;
class_a c2{ "ww" };
class_a c2_1("xx");
// order of parameters is the same as the constructor
class_a c3{ "yy", 4.4 };
class_a c3_1("zz", 5.5);
}
Если класс имеет конструкторы, отличные от по умолчанию, порядок отображения элементов класса в инициализаторе фигурных скобок — это порядок, в котором соответствующие параметры отображаются в конструкторе, а не порядок объявления элементов (как class_a
и в предыдущем примере). В противном случае, если тип не имеет объявленного конструктора, инициализаторы элементов должны отображаться в инициализаторе фигурных скобок в том же порядке, что и объявлены. В этом случае можно инициализировать столько участников, сколько вы хотите, но вы не можете пропустить какой-либо член. В следующем примере показано порядок, используемый в инициализации фигурных скобок, если не объявленный конструктор:
class class_d {
public:
float m_float;
string m_string;
wchar_t m_char;
};
int main()
{
class_d d1{};
class_d d1{ 4.5 };
class_d d2{ 4.5, "string" };
class_d d3{ 4.5, "string", 'c' };
class_d d4{ "string", 'c' }; // compiler error
class_d d5{ "string", 'c', 2.0 }; // compiler error
}
Если конструктор по умолчанию объявлен явным образом, но помечен как удаленный, нельзя использовать пустую инициализацию фигурных скобок:
class class_f {
public:
class_f() = delete;
class_f(string x): m_string { x } {}
string m_string;
};
int main()
{
class_f cf{ "hello" };
class_f cf1{}; // compiler error C2280: attempting to reference a deleted function
}
Вы можете использовать инициализацию фигурных скобок в любом месте, где обычно выполняется инициализация( например, в качестве параметра функции или возвращаемого значения или ключевого new
слова:
class_d* cf = new class_d{4.5};
kr->add_d({ 4.5 });
return { 4.5 };
В /std:c++17
режиме и более поздних версиях правила пустой инициализации фигурных скобок немного более строги. См. сведения о производных конструкторах и расширенной инициализации агрегатов.
конструкторы initializer_list
Класс initializer_list представляет список объектов указанного типа, который можно использовать в конструкторе и в других контекстах. Вы можете создать initializer_list с помощью инициализации фигурных скобок:
initializer_list<int> int_list{5, 6, 7};
Внимание
Чтобы использовать этот класс, необходимо включить заголовок initializer_list>.<
Его initializer_list
можно скопировать. В этом случае элементы нового списка ссылаются на элементы исходного списка:
initializer_list<int> ilist1{ 5, 6, 7 };
initializer_list<int> ilist2( ilist1 );
if (ilist1.begin() == ilist2.begin())
cout << "yes" << endl; // expect "yes"
Классы контейнеров стандартной библиотеки, а regex
также string
wstring
конструкторы и initializer_list
конструкторы. В следующих примерах показано, как выполнять инициализацию фигурных скобок с помощью этих конструкторов:
vector<int> v1{ 9, 10, 11 };
map<int, string> m1{ {1, "a"}, {2, "b"} };
string s{ 'a', 'b', 'c' };
regex rgx{ 'x', 'y', 'z' };