XE Oracle С Application Express.
It's a member initialization list. You should find information about it in any good C++ book.
You should, in most cases, initialize all member objects in the member initialization list (however, do note the exceptions listed at the end of the FAQ entry).
The takeaway point from the FAQ entry is that,
All other things being equal, your code will run faster if you use initialization lists rather than assignment.
there is another 'benefit'
if the member variable type does not support null initialization or if its a reference (which cannot be null initialized) then you have no choice but to supply an initialization list
Это список инициализации. Он инициализирует элементы перед запуском тела конструктора. Рассмотрим
class Foo {
public:
string str;
Foo(string &p)
{
str = p;
};
};
vs
class Foo {
public:
string str;
Foo(string &p): str(p) {};
};
В первом примере str будет инициализирована своим конструктором без аргументов
string();
перед телом конструктора Foo. Внутри конструктора foo
string& operator=( const string& s );
будет вызываться для 'str', как вы делаете str = p;
Во втором примере str будет инициализироваться напрямую вызов его конструктора
string( const string& s );
с аргументом p.
Не знаю, как вы могли пропустить этот, он довольно простой. Это синтаксис для инициализации переменных-членов или конструкторов базовых классов. Он работает как с обычными старыми типами данных, так и с объектами классов.
You are correct, this is indeed a way to initialize member variables. I'm not sure that there's much benefit to this, other than clearly expressing that it's an initialization. Having a "bar=num" inside the code could get moved around, deleted, or misinterpreted much more easily.
This is called an initialization list. It is a way of initializing class members. There are benefits to using this instead of simply assigning new values to the members in the body of the constructor, but if you have class members which are constants or references they must be initialized.
Это инициализация конструктора. Это правильный способ инициализации членов в конструкторе класса, поскольку он предотвращает вызов конструктора по умолчанию.
Рассмотрим эти два примера:
// Example 1
Foo(Bar b)
{
bar = b;
}
// Example 2
Foo(Bar b)
: bar(b)
{
}
В примере 1:
Bar bar; // default constructor
bar = b; // assignment
В примере 2:
Bar bar(b) // copy constructor
Все дело в эффективность.
Другой уже объяснил вам, что синтаксис, который вы наблюдаете, называется «списком инициализаторов конструктора». Этот синтаксис позволяет вам индивидуально инициализировать базовые подобъекты и подобъекты-члены класса (в отличие от разрешения им инициализировать по умолчанию или оставаться неинициализированными).
Я просто хочу отметить, что синтаксис, который, как вы сказали, " выглядит как вызов конструктора ", не обязательно вызов конструктора. В языке C ++ синтаксис ()
- это всего лишь одна стандартная форма синтаксиса инициализации . Для разных типов он интерпретируется по-разному. Для типов классов с определяемым пользователем конструктором это означает одно (это действительно вызов конструктора), для типов классов без определяемого пользователем конструктора это означает другое (так называемая инициализация значения ) для пустых ()
), а для неклассовых типов это снова означает нечто иное (поскольку неклассовые типы не имеют конструкторов).
В вашем случае член данных имеет тип int
. int
не является типом класса, поэтому у него нет конструктора. Для типа int
этот синтаксис означает просто «инициализировать bar
значением num
» и все. Это делается именно так, напрямую, без использования конструкторов, поскольку, опять же, int
не является типом класса, поэтому у него не может быть никаких конструкторов.
()
), а для неклассовых типов это снова означает что-то другое (поскольку не- типы классов не имеют конструкторов).
В вашем случае член данных имеет тип int
. int
не является типом класса, поэтому у него нет конструктора. Для типа int
этот синтаксис означает просто «инициализировать bar
значением num
» и все. Это делается именно так, напрямую, без использования конструкторов, поскольку, опять же, int
не является типом класса, поэтому у него не может быть никаких конструкторов.
()
), а для неклассовых типов это снова означает нечто иное (поскольку не- типы классов не имеют конструкторов).
В вашем случае член данных имеет тип int
. int
не является типом класса, поэтому у него нет конструктора. Для типа int
этот синтаксис означает просто «инициализировать bar
значением num
» и все. Это делается именно так, напрямую, без использования конструкторов, поскольку, опять же, int
не является типом класса, поэтому у него не может быть никаких конструкторов.
int
этот синтаксис означает просто «инициализировать bar
значением num
» и все. Это делается именно так, напрямую, без использования конструкторов, поскольку, опять же, int
не является типом класса, поэтому у него не может быть никаких конструкторов. Для типа int
этот синтаксис означает просто «инициализировать bar
значением num
» и все. Это делается именно так, напрямую, без использования конструкторов, поскольку, опять же, int
не является типом класса, поэтому у него не может быть никаких конструкторов.