Я видел эту программу. Что это - re (r), im (i) {} после сложного конструктора (double r, double i)? - PullRequest
0 голосов
/ 10 октября 2011
// operator_overloading.cpp
// compile with: /EHsc
#include <iostream>
using namespace std;

struct Complex {
   Complex( double r, double i ) : re(r), im(i) {} // what is this syntax?
   Complex operator+( Complex &other );
   void Display( ) {   cout << re << ", " << im << endl; }
private:
   double re, im;
};

// Operator overloaded using a member function
Complex Complex::operator+( Complex &other ) {
   return Complex( re + other.re, im + other.im );
}

int main() {
   Complex a = Complex( 1.2, 3.4 );
   Complex b = Complex( 5.6, 7.8 );
   Complex c = Complex( 0.0, 0.0 );

   c = a + b;
   c.Display();
}

Ответы [ 3 ]

5 голосов
/ 10 октября 2011
Complex( double r, double i ) : re(r), im(i) {}

Эта конструкция называется Список инициализатора элемента в C ++.

Она инициализирует вашего члена re значением r, иэлемент im для значения i.


В чем разница между инициализацией и назначением внутри конструктора?&
В чем преимущество?

Существует разница между инициализацией элемента с использованием списка инициализатора и присвоением ему значения внутри тела конструктора.

Когда вы инициализируете поля через список инициализаторов, конструкторы будут вызываться один раз.

Если вы используете присваивание, то поля будут сначала инициализированы конструкторами по умолчанию, а затем переназначены (через оператор присваивания) фактическими значениями.присваивание в последнем, что может быть значительным для пользовательских классов.

Для двойного типа данных (для которого вы его используете) или членов класса POD практических затрат нет.

1 голос
/ 10 октября 2011

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

Так что re устанавливается на r. И im устанавливается на i.

1 голос
/ 10 октября 2011

Это список инициализаторов. Инициализирует членов Complex.

Инициализатор-список может использоваться для явной инициализации членов класса. Если вы не инициализируете своих участников таким образом, они будут инициализированы по умолчанию. Некоторые типы элементов должны быть инициализированы таким образом, например, ссылки (потому что они не могут быть инициализированы по умолчанию) или классы, у которых нет конструктора по умолчанию.

Этот синтаксис также можно использовать для передачи параметров конструкторам суперкласса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...