Для чего членский список переменных после двоеточия в конструкторе, хорошем?

Я думаю, что вы ищете для обнаружения аномалий. При обнаружении аномалий вы попытаетесь найти точки данных, которые отличаются от остальных точек данных, в вашем случае это мошенническая транзакция.

В sklearn доступно довольно много алгоритмов, смотрите здесь . Я бы рекомендовал начать с модели IsolationForest для вашей проблемы.

Из документации.

enter image description here

11
задан fredoverflow 12 November 2011 в 11:09
поделиться

7 ответов

Наиболее распространенный случай - это:

class foo{
private:
    int x;
    int y;
public:
    foo(int _x, int _y) : x(_x), y(_y) {}
}

Это установит x и y к значениям, которые поданы _x и _y в параметрах конструктора. Это часто - лучший способ создать любые объекты, которые объявляются как элементы данных.

Также возможно, что Вы смотрели на конструктора, объединяющего в цепочку:

class foo : public bar{
    foo(int x, int y) : bar(x, y) {}
};

В этом экземпляре конструктор класса вызовет конструктора его базового класса и передаст значения x и y.

Разделять функцию еще больше:

TransparentObject::TransparentObject( int w, int x, int y, int z ) : 
   _someMethod( 0 ),
   _someOtherMethod( 0 ),
   _someOtherOtherMethod( 0 ),
   _someMethodX( 0 ) 
{
     int bla;
     int bla;
}

::- оператор называют оператором разрешения области видимости. Это в основном просто указывает на это TransparentObject член TransparentObject. Во-вторых, Вы корректны в предположении, что тело конструктора происходит в фигурных скобках.

ОБНОВЛЕНИЕ: Спасибо за ответы. Это могут быть вызываемые методы? (Я предполагаю не), и каково различие, называют их в теле конструктора

Существует намного больше информации об этом предмете, чем я мог возможно когда-либо давать Вам здесь. Наиболее распространенная область, где необходимо использовать списки инициализатора, - при инициализации ссылки или a const поскольку этим переменным нужно дать значение непосредственно после создания.

20
ответ дан 3 December 2019 в 01:16
поделиться

Вы достаточно близки. Первая строка является объявлением. Маркировка, оставленная:: имя класса и чтобы это был конструктор, имя функции должно совпасть с именем класса.

TransparentObject::TransparentObject( int w, int x, int y, int z )

В C++ можно дополнительно поместить двоеточие и некоторые начальные значения для членских переменных перед запуском тела функции. Эта техника должна использоваться, если Вы - initialzing какие-либо переменные константы или передающие параметры к конструктору суперкласса.

: 
 _someMethod( 0 ),
 _someOtherMethod( 0 ),
 _someOtherOtherMethod( 0 ),
 _someMethodX( 0 )

И затем прибывает тело конструктора в фигурных скобках.

{
   int bla;
   int bla;
}
10
ответ дан 3 December 2019 в 01:16
поделиться

Код между списком аргументов и {}s указывает инициализацию (часть из) участники класса.

Инициализация в противоположность присвоению---, они - разные вещи---, таким образом, это все вызовы конструкторам.

2
ответ дан 3 December 2019 в 01:16
поделиться

Да:: оператор обзора C++, который позволяет Вам сказать компилятор, чему принадлежит функция. Используя a: после того, как объявление конструктора запускает то, что называют списком инициализации.

2
ответ дан 3 December 2019 в 01:16
поделиться

:: На самом деле средство содержит (см. комментарии для разъяснения), однако _someMethods и т.д - то, что назвало список инициализации. Существует много информации в ссылке =]

Править: Извините, мое первое предложение является неправильным - см. комментарии.

7
ответ дан 3 December 2019 в 01:16
поделиться

Вы корректны. Это - способ установить значения по умолчанию для переменных класса. Я не слишком знаком с точным различием между помещением их после: и в теле функции.

1
ответ дан 3 December 2019 в 01:16
поделиться

Обычно существуют некоторые серьезные основания использовать список инициализации. Для одного Вы не можете переменные элемента множества, которые являются ссылками за пределами списка инициализации конструктора. Также, если членской переменной нужны определенные аргументы ее собственному конструктору, необходимо передать их в сюда. Сравните это:

class A
{
public:
  A();
private:
  B _b;
  C& _c;
};

A::A( C& someC )
{
  _c = someC; // this is illegal and won't compile. _c has to be initialized before we get inside the braces
  _b = B(NULL, 5, "hello"); // this is not illegal, but B might not have a default constructor or could have a very 
                            // expensive construction that shouldn't be done more than once
}

к этой версии:

A::A( C& someC )
: _b(NULL, 5, "hello") // ok, initializing _b by passing these arguments to its constructor
, _c( someC ) // this reference to some instance of C is correctly initialized now
{}
1
ответ дан 3 December 2019 в 01:16
поделиться
Другие вопросы по тегам:

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