С++. Что означает двоеточие после конструктора?

Возможные дубликаты:
Переменные После 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. Это немного быстрее и эффективнее.