Что является этим странным участником двоеточия (“”:) синтаксис в конструкторе?

XE Oracle С Application Express.

  • Имеет хороший веб-gui,
  • база данных "Real"
  • , масштабируется вне единственного рабочего стола
  • Предложения ясный путь масштаба вне малочисленной команды
  • Приложения как веб-, легкодоступные.
  • Может преобразовать электронные таблицы Excel в Приложения
324
задан Taryn 22 March 2017 в 06:25
поделиться

8 ответов

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.

205
ответ дан 23 November 2019 в 00:53
поделиться

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

5
ответ дан 23 November 2019 в 00:53
поделиться

Это список инициализации. Он инициализирует элементы перед запуском тела конструктора. Рассмотрим

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.

6
ответ дан 23 November 2019 в 00:53
поделиться

Не знаю, как вы могли пропустить этот, он довольно простой. Это синтаксис для инициализации переменных-членов или конструкторов базовых классов. Он работает как с обычными старыми типами данных, так и с объектами классов.

7
ответ дан 23 November 2019 в 00:53
поделиться

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.

5
ответ дан 23 November 2019 в 00:53
поделиться

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.

14
ответ дан 23 November 2019 в 00:53
поделиться

Это инициализация конструктора. Это правильный способ инициализации членов в конструкторе класса, поскольку он предотвращает вызов конструктора по умолчанию.

Рассмотрим эти два примера:

// 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

Все дело в эффективность.

16
ответ дан 23 November 2019 в 00:53
поделиться

Другой уже объяснил вам, что синтаксис, который вы наблюдаете, называется «списком инициализаторов конструктора». Этот синтаксис позволяет вам индивидуально инициализировать базовые подобъекты и подобъекты-члены класса (в отличие от разрешения им инициализировать по умолчанию или оставаться неинициализированными).

Я просто хочу отметить, что синтаксис, который, как вы сказали, " выглядит как вызов конструктора ", не обязательно вызов конструктора. В языке 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 не является типом класса, поэтому у него не может быть никаких конструкторов.

8
ответ дан 23 November 2019 в 00:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: