С++. Что означает двоеточие после конструктора?
Возможные дубликаты:
Переменные После Colon в конструкторе
Синтаксический вопрос конструктора С++ (noob)
У меня есть код С++ здесь:
class demo
{
private:
unsigned char len, *dat;
public:
demo(unsigned char le = 5, unsigned char default) : len(le)
{
dat = new char[len];
for (int i = 0; i <= le; i++)
dat[i] = default;
}
void ~demo(void)
{
delete [] *dat;
}
};
class newdemo : public demo
{
private:
int *dat1;
public:
newdemo(void) : demo(0, 0)
{
*dat1 = 0;
return 0;
}
};
Мой вопрос в том, что называется : len(le)
и : demo(0, 0)
?
Это как-то связано с наследованием?
Ответы
Ответ 1
Как говорили другие, это список инициализации. Вы можете использовать его для двух вещей:
- Вызов конструкторов базового класса
- Инициализация переменных-членов перед телом конструктора выполняется.
В случае №1, я предполагаю, что вы понимаете наследование (если это не так, дайте мне знать в комментариях). Таким образом, вы просто вызываете конструктор вашего базового класса.
Для случая №2 может быть задан вопрос: "Почему бы просто не инициализировать его в теле конструктора?" Важность списков инициализации особенно очевидна для членов const
. Например, посмотрите на эту ситуацию, где я хочу инициализировать m_val
на основе параметра конструктора:
class Demo
{
Demo(int& val)
{
m_val = val;
}
private:
const int& m_val;
};
По спецификации С++ это незаконно. Мы не можем изменить значение переменной const
в конструкторе, поскольку оно помечено как const. Таким образом, вы можете использовать список инициализации:
class Demo
{
Demo(int& val) : m_val(val)
{
}
private:
const int& m_val;
};
Это единственный раз, когда вы можете изменить переменную-член const. И как отметил Майкл в разделе комментариев, это также единственный способ инициализировать ссылку, которая является членом класса.
Вне использования его для инициализации переменных-членов const
он, как представляется, был общепризнан как "путь" инициализации переменных, поэтому он позволяет другим программистам читать ваш код.
Ответ 2
Это называется списком инициализации. Он предназначен для передачи аргументов конструктору родительского класса. Вот хорошая ссылка, объясняющая это: Списки инициализации на С++
Ответ 3
Он называется списком инициализации. Он инициализирует элементы до того, как тело конструктора выполнит.
Ответ 4
Он называется списком инициализации. Список инициализаторов - это то, как вы передаете аргументы конструкторам своих переменных-членов и передаете аргументы конструктору родительского класса.
Если вы используете =
для назначения в теле конструктора, сначала вызывается конструктор по умолчанию, затем вызывается оператор присваивания. Это немного расточительно, и иногда нет эквивалентного оператора присваивания.
Ответ 5
Вы вызываете конструктор своего базового класса, demo.
Ответ 6
Это означает, что len
не задается с использованием конструктора по умолчанию. а класс demo
строится. Например:
class Demo{
int foo;
public:
Demo(){ foo = 1;}
};
Сначала поместите значение в foo, прежде чем устанавливать его в 1. Это немного быстрее и эффективнее.